Spa*_*wer 2 java unit-testing mockito powermock
是否可以使用Mockito注释模拟抽象类并使用模拟类注入它.我现在有以下情况:
@Mock private MockClassA mockClassA;
@Mock private MockClassB mockClassB;
@Mock(answer = Answers.CALLS_REAL_METHODS) private AbstractClassUnderTest abstractClassUnderTest;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
Whitebox.setInternalState(abstractClassUnderTest, mockClassA);
Whitebox.setInternalState(abstractClassUnderTest, mockClassB);
}
Run Code Online (Sandbox Code Playgroud)
我想在AbstractClassUnderTest上使用类似@InjectMocks的东西,但它不能与@Mock结合使用.目前的情况,来自Powermock的Whitebox,但我很好奇是否有可能只用注释来解决它.我找不到任何解决方案或例子.
(我知道测试抽象类的反对意见,我个人宁愿测试一个具体的实现,只使用@InjectMocks.)
由于一个明显的原因,我不知道有什么方法可以解决这个问题:@InjectMocks适用于被测试的非模拟系统,而@Mock适用于模拟合作者,而Mockito不适用于任何类别以填充这些角色在同一个测试中.
请记住,您的@Mock(CALLS_REAL_METHODS)声明本质上是危险的:您正在测试AbstractClassUnderTest,但您没有运行任何构造函数或初始化任何字段.我不认为你可以期望这种设计的测试是真实的或强大的,无论注释能为你做什么或不能做什么.(就个人而言,我之前赞成将抽象类的真正部分模拟作为"工具箱中的工具",但我现在认为它们与现实相距甚远,无法发挥作用.)
如果我在你的位置,我会创建一个小的覆盖实现来测试:
@RunWith(JUnit4.class) public class AbstractClassTest {
/** Minimial AbstractClass implementation for testing. */
public static class SimpleConcreteClass extends AbstractClass {
public SimpleConcreteClass() { super("foo", "bar", 42); }
@Override public void abstractMethod1() {}
@Override public String abstractMethod2(int parameter) { return ""; }
}
@InjectMocks SimpleConcreteClass classUnderTest;
@Mock mockClassA;
@Mock mockClassB;
}
Run Code Online (Sandbox Code Playgroud)
此时,您有一个简单且可预测的AbstractClass实现,如果您只想测试AbstractClass是否具有与之前相同的扩展API,则即使没有模拟框架也可以使用它.(这是一个经常被忽视的抽象类测试.)你甚至可以提取它,因为它可能对其他测试有用:如果你想覆盖单个测试类的抽象行为,你可以创建一个匿名内部类只需一个方法覆盖,或者您可以设置classUnderTest = spy(classUnderTest);设置Mockito代理和您想要的行为.
(请记住,@ InjectMocks和@Spy不能可靠地一起使用,如此GitHub问题以及它链接的Google Code和邮件列表线程中所述.)
| 归档时间: |
|
| 查看次数: |
7325 次 |
| 最近记录: |