繁体   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