簡體   English   中英

Mockito NotaMockException

[英]Mockito NotaMockException

我正面臨 Mockito junit 測試的問題。 我是新手,對我面臨的問題有點困惑。 對此的任何幫助將不勝感激。

class Activity{

    public void firstMethod(){

      String str = secondMethod();
   }

    public String secondMethod(){
      String str = null;

      /*  some Code */

      return str;
   }
}

獲取異常:

*org.mockito.exceptions.misusing.NotAMockException: 
 Argument passed to when() is not a mock!*

在下面的代碼中

class ActivityTest(){

  Activity act;

  @Before
  public void setup(){
     act = new Activity();
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn(Mockito.anyString()).when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

我知道活動不是模擬,但我不確定有沒有辦法解決這個問題,因為secondMethod()是同一個類中的方法。 我需要為secondMethod()編寫規則,因為我已經完成了它的單元測試。 secondMethod()的定義包含外部依賴。 我應該嘲笑secondMethod()存在的外部依賴項並為它們編寫規則而不是為secondMethod()編寫規則嗎?

我找到了這篇文章: Mockito Spy'ing on the object being unit testing 然而,將 secondMethod() 分成不同的類沒有意義。 我的方法與這個類有關。 為測試創建一個不同的類對我來說似乎不合適。 即使使用 spy() 模擬實際類也不是最正確的方法,正如帖子中已經解釋的那樣。

我認為我不應該創建 Activity 類的模擬,因為這是我正在測試的類。 我真的很感激對此的幫助和見解。

正如您所指出的, act不是模擬,因此您無法在其上記錄行為。 你可以使用Mockito.spy ,好了,間諜(或部分模擬)的act對象,以便只錄制的行為secondMethod和執行實際代碼firstMethod

但是請注意,無論您如何mockspy對象,都不能在doReturn調用中使用匹配器。 返回值必須是具體的對象。

class ActivityTest() {

  Activity act;

  @Before
  public void setup(){
     act = Mockito.spy(new Activity()); // Here!
  }

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

稍微優雅的語法允許您使用注釋而不是顯式調用Mockito.spy ,但這確實是一個品味問題:

@RunWith(MockitoJUnitRunner.class)
class ActivityTest() {

  @Spy
  Activity act = new Activity();

  @Test
  public void testFirstMethod(){

      Mockito.doReturn("someString").when(act).secondMethod();
      act.firstMethod();
      verify(act).secondMethod();
  }
} 

這里有一些提示:

  1. 模擬活動。
  2. 使用 when / then / doReturn 調整 secondMethod 的行為
  3. 調用 firstMethod 時使用 doCallRealMethod。

希望能幫助到你。

在這個例子中沒有理由嘲笑任何東西。 由於沒有依賴項並且兩個方法都是公共的,因此您可以直接測試它們。

public class ActivityTest() {

    private Activity act = new Activity();

    @Test
    public void testSecondMethod(){
        assertEquals("expected-value", act.secondMethod());
    }

    @Test
    public void testFirstMethod() {
        act.firstMethod();
        // success if no exception occurs
    }
} 

由於 firstMethod 對 Act 實例和任何依賴項(因為沒有)都沒有任何可檢測的影響,因此您可以簡單地調用該方法,如果沒有拋出異常就可以滿足。 人們也可以推斷根本不應該測試這種方法。

我假設給出的例子是一個類的簡化,其中調用 firstMethod 實際上確實有副作用,誰知道...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM