模拟 Verticle 所依赖的 class
Mocking a class that Verticle depends on
我正在玩 Vert.x 3 framework/library。
我编写了一个简单的 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(BookmarksVerticle.java:88)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking(ContextImpl.java:279)
at io.vertx.core.impl.OrderedExecutorFactory$OrderedExecutor.lambda$new1(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 方法来删除自动创建 classes 的 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 没有任何依赖但使用 DAO class 的方法,从混合中删除了 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。
谢谢
BookmarksVerticle
是否有非默认构造函数?
@InjectMocks
的文档指出在这种情况下不会发生字段注入。
看这里:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/InjectMocks.html
好消息是 Mockito 可以与 VertxUnitRunner
一起使用!
事实证明,在命令行和 Eclipse 中使用 Maven 把我搞得一团糟。一旦我将嵌入式 maven 切换为使用与我从命令行使用的相同的 maven 安装,事情就开始工作了。
以下是另一个答案的详细信息:
Successful build in Maven still showing errors in Eclipse
我正在玩 Vert.x 3 framework/library。 我编写了一个简单的 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(BookmarksVerticle.java:88)
at io.vertx.core.impl.ContextImpl.lambda$executeBlocking(ContextImpl.java:279)
at io.vertx.core.impl.OrderedExecutorFactory$OrderedExecutor.lambda$new1(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 方法来删除自动创建 classes 的 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 没有任何依赖但使用 DAO class 的方法,从混合中删除了 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。
谢谢
BookmarksVerticle
是否有非默认构造函数?
@InjectMocks
的文档指出在这种情况下不会发生字段注入。
看这里:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/InjectMocks.html
好消息是 Mockito 可以与 VertxUnitRunner
一起使用!
事实证明,在命令行和 Eclipse 中使用 Maven 把我搞得一团糟。一旦我将嵌入式 maven 切换为使用与我从命令行使用的相同的 maven 安装,事情就开始工作了。
以下是另一个答案的详细信息: Successful build in Maven still showing errors in Eclipse