模拟一个vertical所依赖的类



我在玩Vert。x3框架/库。我写了一个简单的垂直,通过Spring IoC管理对象依赖关系。

这是垂直代码段

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();
}   

一切都很好。所以我想写一些测试。我正在使用顶点单元测试,并试图模拟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没有被注入到vertical中。

你知道为什么会这样吗?

更新:

尝试通过在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, options, 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兼容!事实证明,在命令行和Eclipse中使用Maven会把我搞得一团糟。一旦我切换出嵌入式maven,使用与我从命令行使用的相同的maven安装,事情就开始工作了。

下面是另一个答案的细节:在Maven中成功构建,但在Eclipse中仍显示错误

BookmarksVerticle有非默认构造函数吗?

@InjectMocks的文档说明在这种情况下不会发生字段注入。

请看这里:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/InjectMocks.html

相关内容

  • 没有找到相关文章

最新更新