java - 模拟 Verticle 所依赖的类

标签 java unit-testing mockito vert.x

我正在使用 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 没有被注入(inject)到 Verticle 中。

关于为什么会出现这种情况有什么想法吗?

更新:

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

@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 和 VertxUnitRunner,该方法对 vertx 没有任何依赖性但使用了 DAO 类。

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 安装,事情就开始工作了。

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

关于java - 模拟 Verticle 所依赖的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32750146/

相关文章:

java - Mockito:了解when().thenThrow()函数如何工作

java - Android - 条码扫描,选项?志兴?

c# - 在 C# 测试中出现两个 string[] 和 AreEqual 的错误

java - 测试 JUnit 和 EclEmma 时遗漏的分支

java - Mockito 缺少方法调用异常

java - JUnit 更改集成测试中的类或方法行为

Java while 循环跳过用户输入的第一次迭代

javascript - JEST 和 ES6 导入 - 基于根文件夹的导入不起作用

java - 用模拟版本替换静态字段会导致 IllegalArgumentException

java - (Spark skewed join) 如何在没有内存问题的情况下连接两个具有高度重复键的大型 Spark RDD?