我與Vert.x 3框架/庫中播放類。我寫了一個簡單的Verticle,它具有通過Spring IoC管理的對象依賴關係。嘲笑那Verticle取決於
這裏是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單元測試,並試圖嘲笑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中。
爲什麼這可能是這種情況的任何想法?
UPDATE:
試圖消除的Mockito通過添加setter方法對BookmarksVerticle
的DAO自動創建類,然後在單元測試改變的設置方法如下:
@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
UPDATE 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。
感謝
貌似mockDao是沒有得到注入bmVerticle。嘗試從@Mock中刪除名稱屬性或嘗試@Mock(name =「bookmarksDao」) – user2953113
謝謝,但我嘗試了這兩個,也沒有工作。我只是不確定爲什麼mockDao沒有被注入。我之前使用過幾次,而不是Vert.x –
最重要的是,我添加的日誌(JUL和log4j)都不起作用。後者似乎是B/C它找不到log4j.xml,但是這是在類路徑 –