2015-09-23 49 views
3

我與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。

感謝

+0

貌似mockDao是沒有得到注入bmVerticle。嘗試從@Mock中刪除名稱屬性或嘗試@Mock(name =「bookmarksDao」) – user2953113

+0

謝謝,但我嘗試了這兩個,也沒有工作。我只是不確定爲什麼mockDao沒有被注入。我之前使用過幾次,而不是Vert.x –

+0

最重要的是,我添加的日誌(JUL和log4j)都不起作用。後者似乎是B/C它找不到log4j.xml,但是這是在類路徑 –

回答

0

好消息是工作的Mockito與VertxUnitRunner! 原來使用Maven在命令行和Eclipse的是搞亂了我。一旦我切換出嵌入式Maven使用與我在命令行中使用的maven install相同的東西,就開始工作了。

下面是另一個答案細節: Successful build in Maven still showing errors in Eclipse

+0

對於那些感興趣的代碼可以在這裏訪問https://github.com/CodeSmell/VertX-Bookmarks –

0

是否BookmarksVerticle具有非默認構造函數?

@InjectMocks文檔狀態字段注入不會在這種情況下發生的。

在這裏看到:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/InjectMocks.html

+0

'BookmarksVerticle'只有默認的構造函數。謝謝。 –

+0

當一切都失敗時,擺脫魔法。嘗試使用'new'直接手動創建'BookmarksVerticle'。爲Spring留下一個受保護的默認構造函數(這樣自動裝配工作)並創建一個單獨的公共構造函數,使用'BookmarksDao',以便您可以直接將其傳遞以進行測試。 – sh0rug0ru

+0

我爲DAO添加了一個setter方法,並按照建議消除了模擬注入。請參閱OP中的UPDATE。 –