我正在尝试为java类编写测试用例。我已经使用Mockito模拟了一种方法,但模拟从未被使用过。为什么呢?
以下是我的java类的结构:
class A {
@Autowired
private ClassB classB;
publiv void methodOne() {
methodTwo();
}
private void methodTwo() {
...
int returnedValue = classB.someMethod();
...
}
}
测试课程如下:
class ATest {
@Mock
private ClassB classB;
@InjectMocks
@Autowired
ClassA classA;
@Before
public void setupTest() {
MockitoAnnotations.initMocks(this);
}
@Test(expected = SomeException.class)
public void testMethodOne() {
when(classB.someMethod()).thenReturn(29);
classA.methodOne();
}
}
测试类从具有@RunWith(SpringJUnit4ClassRunner.class)
注释的另一个扩展。
我已经完成了现有的问题,但一直无法找到答案。如果有任何可能对我有帮助的问题/答案,请指出我的相同内容。
提前致谢!
答案 0 :(得分:0)
您可以尝试删除测试类@Autowired
中的ATest
。
@InjectMocks
应该足够了,因为它会创建您的测试对象并注入您的模拟。
根据您的JUnit跑步者@Autowired
可能会在@InjectMocks
之后执行第二次注入,这会覆盖您的模拟方法设置。
答案 1 :(得分:0)
首先,关于测试的一些注意事项:
- 测试应该是公开的
- A级应该是公开的
- 测试中不需要@Autowire
- 无需致电initMocks
然后,您的测试实际上并未测试是否正在使用模拟。让我们更改这些方法,以便它们现在返回值,以便我们可以测试它们是否有效:
public class ClassA {
@Autowired
private ClassB classB;
public int methodOne() {
return methodTwo();
}
private int methodTwo() {
return classB.someMethod();
}
}
public class ClassB {
public int someMethod() {
return 0;
}
}
我们现在可以测试:
@RunWith(MockitoJUnitRunner.class)
public class ATest {
@Mock
private ClassB classB;
@InjectMocks
ClassA classA;
@Test
public void testMethodOne() {
when(classB.someMethod()).thenReturn(29);
final int result = classA.methodOne();
assertEquals(29, result);
}
}
测试通过 - 意味着模拟正确使用。
希望有所帮助。
答案 2 :(得分:0)
您缺少的是注释只是声明。 @Mock和@InjectMocks注释不执行任何操作。它们只是测试运行者可以看到的标记,用于执行特定的特定于跑步者的行为。您需要@RunWith注释来指定测试运行器,但是您需要针对特定行为的特定测试运行器。如果您正在使用SpringJUnit4ClassRunner,则不会使用任何Mockito注释。在任何情况下,我都不想使用SpringJUnit4ClassRunner进行单元测试,因为您应该只是验证业务逻辑,而不是布线。
将测试类更改为使用@RunWith(MockitoJUnitRunner.class)并删除基类引用。