mockito 如何执行一个使用过的组件的代码来代替@在JUnit测试中模拟结果?

dba5bblo  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(132)

我有一个@Component类,它包含一些@Inject组件来执行一些代码逻辑。在我的测试中,我希望执行该逻辑,而不是模拟结果。我不希望导入spring-boot-starter-test,因为它将重载依赖项并生成冲突。
Service1Service2不使用任何第三种服务,它只是执行了简单的逻辑。

@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...
    }
}
oknwwptz

oknwwptz1#

最好的方法是只使用构造函数或访问器注入而不是字段注入(阅读更多herehere),但是如果您真的需要坚持字段注入,只需将@Mock注解替换为@Spy注解,如下所示:

@Spy
private Service1 service1;
@Spy
private Service2 service2;

或(如果ServiceX类别没有预设建构函式):

@Spy
private Service1 service1 = new Service1(...);
@Spy
private Service2 service2 = new Service2(...);

当您调用initMocks时,Mockito将使用这些字段,并将它们注入到用@InjectMocks注解的字段中。不需要行为模拟,将调用实际的ServiceX类代码。
我在a GitHub repository here中准备了一个完全可重现的代码示例-测试通过。

jvlzgdj9

jvlzgdj92#

如果要使用service1service2的真实示例,可以使用@Spy

相关问题