【问题标题】:Creating a mock with Jmock to return a null value for itself使用 Jmock 创建一个模拟来为自己返回一个空值
【发布时间】:2009-05-10 03:09:50
【问题描述】:

我有一个类似于以下的方法:

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 做到这一点?这种模式有意义吗?这是一个有效的测试吗?如果没有,是否有人对如何测试有任何建议?

【问题讨论】:

    标签: java unit-testing mocking jmock


    【解决方案1】:

    我认为您不能仅使用 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() 当然不能被调用。

    【讨论】:

    • 我想这确实是测试它的唯一方法 - 传入一个空值,也就是说。只需检查是否有使用模拟的实际方法。干杯!
    【解决方案2】:

    Mocks 应该用于测试对象如何与其协作者交互。如果没有合作者,那么就没有什么可嘲笑的了。传入 null 更简单,更具表现力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-23
      • 2023-03-07
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多