【问题标题】:jUnit - How to assert that inherited methods are invoked?jUnit - 如何断言调用了继承的方法?
【发布时间】:2009-05-12 16:47:26
【问题描述】:

假设您有一些想要扩展的第 3 方 library 类,只需为其添加便利方法(例如,您可以使用默认参数调用继承的方法)。

使用 jUnit/jMock,是否可以编写一个断言/模拟期望来测试是否调用了正确的继承方法?

例如,像这样的:

class SomeClass extends SomeLibraryClass {
    public String method(String code) {
         return method(code, null, Locale.default());
    }
}

如何断言 method 正在被调用?

【问题讨论】:

  • 您是要测试是否调用了正确的消息签名,还是要测试消息查找本身?
  • 我想测试一下是否调用了正确的签名。我可以假设(希望)图书馆可以工作。
  • 使用@Override 注解,让​​编译器判断你是否确实按照预期覆盖了方法?
  • @killdash10 这不是覆盖,因为该方法具有不同的签名...

标签: java inheritance junit jmock


【解决方案1】:

您可以在单元测试中创建一个实际告诉您的进一步子类:

public class MyTest {
    boolean methodCalled = false;

    @Test
    public void testMySubclass(){
          TestSomeClass testSomeClass = new TestSomeClass();
          // Invoke method on testSomeclass ...
          assertTrue( methodCalled);

    }  
    class TestSomeClass extends SomeClass{
        public String method(String code){
              methodCalled = true;
        } 
     }
}

【讨论】:

  • 这不是告诉你你的测试子类是否覆盖了方法,而不是你的“真实”子类覆盖了方法吗?即使您的“真实”子类没有覆盖该方法,此测试也会通过。
【解决方案2】:

单元测试更有助于验证给定方法的功能,而不是断言覆盖率。更关心调用什么方法的单元测试比他们应该知道的更多地了解他们正在测试的类,更不用说会让读者感到困惑。

CoberturaEMMA 等覆盖工具会告诉您是否正确覆盖了代码。

【讨论】:

  • 我理解你的意思,问题是这个方法除了调用具有正确签名的父方法之外没有任何功能。
  • 如果方法没有功能,为什么会存在?单元测试应该断言当方法被调用时用户期望发生什么。
  • 我从您的上述评论中看到并重新阅读您的初始帖子,这是在包装第 3 方库?我很遗憾错过了这一点,这在范围上有点独特。
【解决方案3】:

在这种情况下只编写集成测试可能确实更好,但如果你真的想要一个单元测试,你可以像在任何其他情况下一样轻松地拥有它:

public class SomeClassTest
{
    @Test
    public void testMethod()
    {
        final String code = "test";

        new Expectations()
        {
            SomeLibraryClass mock;

            {
                mock.method(code, null, (Locale) any);
            }
        };

        new SomeClass().method(code);
    }
}

此测试使用 JMockit 模拟 API。

【讨论】:

  • 这是个好主意。有时会调用后代类的方法 = 未调用 supe 的方法。
【解决方案4】:

如果没有更具体的例子,很难说,但我猜这应该是一个集成测试——一起测试整个包——而不是单元测试。有时,单元测试可能过于细化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多