java – 模拟Verticle所依赖的类

前端之家收集整理的这篇文章主要介绍了java – 模拟Verticle所依赖的类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在使用Vert.x 3框架/库.
我编写了一个简单的Verticle,它具有通过Spring IoC管理的对象依赖性.

这是Verticle片段

public class BookmarksVerticle extends AbstractVerticle {
    private static Logger log = LoggerFactory.getLogger(BookmarksVerticle.class);

    @Resource
    private BookmarkDao bookmarksDao;

这是Spring配置代码

@Bean 
public BookmarkDao bookmarksDao() {
    ...
}
@Bean 
public BookmarksVerticle bookmarkVerticle() {
     return new BookmarksVerticle();
}   

这一切都很有效.所以想写一些测试.
我正在使用vertx-unit测试,并试图模拟DAO

这就是我所拥有的

@RunWith(VertxUnitRunner.class)
public class BookmarksVerticleTest {

    int port = 8888;
    private Vertx vertx;

    @Mock(name = "BookmarkDao")
    BookmarkDao mockDao;
    @InjectMocks
    BookmarksVerticle bmVerticle;

    @Before
    public void init(TestContext context) {
        MockitoAnnotations.initMocks(this);

        vertx = Vertx.vertx();
        DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port",port));
        vertx.deployVerticle(bmVerticle,options,context.asyncAssertSuccess());
    }

然而,当我运行测试时,我得到了NPE

SEVERE: NULL
java.lang.NullPointerException
    at vertx.pragprog.bookmarks.BookmarksVerticle.asynchRetrieveBookmark(BookmarksVerticle.java:169)
    at vertx.pragprog.bookmarks.BookmarksVerticle.lambda$1(BookmarksVerticle.java:88)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$14(ContextImpl.java:279)
    at io.vertx.core.impl.OrderedExecutorFactory$OrderedExecutor.lambda$new$161(OrderedExecutorFactory.java:91)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

触发异常的行是我访问DAO的地方

        Bookmark bm = bookmarksDao.getBookmark(id);

mockDao没有注入Verticle.

关于为什么会出现这种情况的任何想法?

更新:

尝试通过在BookmarksVerticle上为DAO添加setter方法删除Mockito自动创建类,然后在单元测试中更改setup方法,如下所示:

@Before
public void setUp(TestContext context) {    
    log.info("setting up...");
    //MockitoAnnotations.initMocks(this);

    mockDao = mock(BookmarkDao.class);
    bmVerticle = new BookmarksVerticle();
    bmVerticle.setBookmarkDao(mockDao);

    vertx = Vertx.vertx();
    DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port",port));
    vertx.deployVerticle(bmVerticle,context.asyncAssertSuccess());
}

即使采用这种方法,我仍然会获得NPE

更新2

我通过测试BookmarksVerticle上没有任何依赖于vertx但使用了DAO类的方法,从混合中删除了vertx和VertxUnitRunner.

public class BookmarksServiceTest {

    @Mock(name = "BookmarkDao")
    BookmarkDao mockDao;
    @InjectMocks
    BookmarksVerticle bmVerticle;

    @Before
    public void setUp() {   
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test_retrieveBookmark() {
        String id = "1";
        when(mockDao.getBookmark(Matchers.anyString())).thenReturn(new Bookmark(id,"url","Vert.x"));

        Bookmark bm = bmVerticle.retrieveBookmark(id);
        assertNotNull(bm);
        assertEquals(id,bm.getBookmarkId());
        assertEquals("Vert.x",bm.getBookmarkTitle());
    }

}

这很棒!似乎VertxUnitRunner可能以某种方式干扰Mockito.

谢谢

最佳答案
好消息是Mockito与VertxUnitRunner合作!
事实证明,在命令行中使用Maven并且从Eclipse中弄乱了我.一旦我关闭嵌入式maven以使用与我在命令行中使用相同的maven安装,就会开始工作.

以下是另一个答案的详细信息:
Successful build in Maven still showing errors in Eclipse

猜你在找的Java相关文章