簡體   English   中英

使用Jmock創建一個mock來為自己返回一個null值

[英]Creating a mock with Jmock to return a null value for itself

我有一個類似於以下方法:

public void myMethod(MyClass c)
{
  if (c == null)
  {
    return;
  }
  try
  {
    c.someMethod();
  }
  catch (SomeException e)
  {
    // log the exception, possibly re-throw
  }
}

我試圖找到一種方法來設置MyClass參數c的模擬實例,使其為自身返回null值,並且永遠不會調用c.someMethod()。 我的單元測試看起來像這樣:

@Test
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Mockery mockery = new Mockery()
    {{
            setImposteriser(ClassImposteriser.INSTANCE);
    }};

    final MyClass mockMyClass = mockery.mock(MyClass.class);

    try
    {
        mockery.checking(new Expectations()
        {{
            oneOf(mockMyClass).equals(null);
                will(returnValue(true));

            never(mockMyClass).someMethod();
        }});
    }
    catch (Exception e)
    {
        logger.fatal(e);
        fail("Exception thrown in test.");
    }
    Util.myMethod(mockMyClass);
}

基本上,我正在設置一個MyClass的模擬實例,並設置它的期望值,當它的值被測試為空值時,它將返回true,並且方法someMethod()永遠不會被調用。

現在,測試失敗了,因為jMock說不可能覆蓋Object類提供的方法(equals(null)部分)。

有沒有辦法用jMock做到這一點? 這種模式有意義嗎? 這是一個有效的測試嗎? 如果沒有,有人對如何測試有任何建議嗎?

我不認為你只能使用JMock來測試這段代碼。

我會通過直接傳入null來測試這個。 如果沒有拋出或記錄異常,您就知道您的代碼按預期工作了。@ Test

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Util.myMethod(null);
    //no exception should be thrown.
}

如果你想讓它更明確,你可以將myMethod(null)調用包裝在try / catch塊中,但這不是必需的,除非在出現故障時澄清失敗原因。

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    try
    {
        Util.myMethod(null);
    }
    catch( ExpectedException e )
    {
        fail( "Should not have thrown exception: " + e.getMessage() ); 
    }
}

這是一個充分的測試,因為你知道如果cnull那么c.something()當然不能被調用。

模擬應該用於測試對象如何與其協作者交互。 如果沒有合作者,那么沒有什么可以嘲笑的。 傳入null更簡單,更具表現力。

暫無
暫無

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

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