我有一个@Component
类,它包含一些@Inject
组件来执行一些代码逻辑。在我的测试中,我希望执行该逻辑,而不是模拟结果。我不希望导入spring-boot-starter-test
,因为它将重载依赖项并生成冲突。Service1
和Service2
不使用任何第三种服务,它只是执行了简单的逻辑。
@Component
public class MainService {
@Inject
private Service1 service1;
@Inject
private Service2 service2;
}
---------------- Test Class ----------------
@RunWith(MockitoJUnitRunner.class)
public class SomeTest {
@Mock
private Service1 service1;
@Mock
private Service2 service2;
@InjectMocks
private MainService mainService;
@Before
public void startUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test1() {
Mockito.when(service1.function).thenReturn(...);
Mockito.when(service2.function).thenReturn(...);
// How to provide real execution instead Mock the results?
mainService.start();
// asserts...
}
}
2条答案
按热度按时间oknwwptz1#
最好的方法是只使用构造函数或访问器注入而不是字段注入(阅读更多here或here),但是如果您真的需要坚持字段注入,只需将
@Mock
注解替换为@Spy
注解,如下所示:或(如果
ServiceX
类别没有预设建构函式):当您调用
initMocks
时,Mockito将使用这些字段,并将它们注入到用@InjectMocks
注解的字段中。不需要行为模拟,将调用实际的ServiceX
类代码。我在a GitHub repository here中准备了一个完全可重现的代码示例-测试通过。
jvlzgdj92#
如果要使用
service1
和service2
的真实示例,可以使用@Spy