也许我的搜索完全失败了,但我找不到任何与如何为 Java 类/方法编写单元测试相关的文档或讨论,这些类/方法又会调用其他非私有(private)方法。看起来,如果必须使用 spy 来测试需要模拟内部方法调用的方法,Mockito 的立场可能是设计有问题(不是真正的面向对象)。我不确定这是否总是正确的。但使用 spy 似乎是实现这一目标的唯一方法。例如,为什么你不能有一个“包装器”风格的方法,它反过来依赖于其他方法来实现原始功能,但另外提供功能、错误处理、日志记录或依赖于其他方法结果的不同分支等?
所以我的问题有两个方面:
- 拥有一个内部调用其他方法的方法是否设计和实现不当?
- 如果选择 Mockito 作为他们的模拟框架,为这种方法编写单元测试的最佳实践和/或方法是什么(假设它本身是一个好主意)?
这可能是一个困难的请求,但我希望那些决定回答的人不要仅仅重新发布 Mockito 的措辞和/或对 spy 的立场,因为我已经知道这种方法和意识形态。另外,我也使用过 Powermockito。对我来说,这里的问题是 Mockito 开发了这个框架,必须创建额外的解决方法来支持这种需求。所以我想我想要回答的问题是,如果 spy 是“坏的”,并且 Powermockito 不可用,那么应该如何对调用其他非私有(private)方法的方法进行单元测试?
最佳答案
Is it poorly designed and implemented code to have a method that internally calls other methods?
不是真的。但我要说的是,在这种情况下,调用其他方法的方法应该像其他方法尚未单独测试一样进行测试。 也就是说,它可以防止您的公共(public)方法在您没有注意到的情况下停止调用其他方法。
是的,它(有时)需要大量测试代码。我相信这就是重点:编写测试的痛苦是一个很好的线索,表明您可能要考虑将这些子方法提取到一个单独的类中。
如果我可以接受这些测试,那么我认为还没有提取子方法。
What is the best practice and/or approach in writing a unit test for such a method (assuming it is itself a good idea) if one has chosen Mockito as their mocking framework?
我会这样做:
public class Blah {
public int publicMethod() {
return innerMethod();
}
int innerMethod() {
return 0;
}
}
public class BlahTest {
@Test
public void blah() throws Exception {
Blah spy = spy(new Blah());
doReturn(1).when(spy).innerMethod();
assertThat(spy.publicMethod()).isEqualTo(1);
}
}
关于java - 使用 Mockito 调用多个其他方法的方法的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625002/