繁体   English   中英

如何执行使用过的组件的代码而不是@Mock JUnit 测试中的结果?

[英]How to execute the code of a used Component instead @Mock the results in JUnit Tests?

我有一个@Component class ,其中包含一些@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...
    }
}

最好的方法是使用构造函数或访问器注入而不是字段注入( 在此处此处阅读更多内容),但如果您真的需要坚持使用字段注入,只需将@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注释的字段中。 无需行为 mocking,将调用实际的ServiceX类代码。


我在GitHub 存储库中准备了一个完全可重现的代码示例 - 测试通过了。

如果你想使用service1service2的真实实例,你可以使用@Spy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM