如何在Spring集成测试中模拟注入服务的方法

如何在Spring集成测试中模拟注入服务的方法,spring,mockito,Spring,Mockito,我有以下服务类,我想测试 @Service public class MasterService { @Inject private ServiceOne serviceOne; @Autowired private ServiceTwo serviceTwo; @Inject private ServiceThree serviceThree; @VisibleForTesting void execute() {

我有以下服务类,我想测试

@Service
public class MasterService {

    @Inject
    private ServiceOne serviceOne;

    @Autowired
    private ServiceTwo serviceTwo;

    @Inject
    private ServiceThree serviceThree;

    @VisibleForTesting
    void execute() {
        if (serviceThree.isFlag()) {
           ....
        }
    }
我正在测试
execute()
方法我想模拟
servicetree.isFlag()
以返回true。
下面是我的测试

    public class MasterServiceIT{

        @Inject
        private MasterService masterService;

        @Inject
        private ServiceThree serviceThree;

        @Test
        public void testMasterService() {
            when(serviceThree.isFlag()).thenReturn(true); <---- this never works 
            masterService.execute();
        }
    }
公共类MasterServiceIT{
@注入
私人万事达服务;
@注入
私人服务三个服务三个;
@试验
公共无效testMasterService(){

when(servicetree.isFlag())。然后返回(true)您确定需要模拟集成测试吗?有时候,我们需要模拟某些引用SharePoint等外部服务的服务。如果您需要模拟,那么在这种情况下,您需要在spring上下文中模拟spring service bean。您可以通过
@MockBean

来完成吗您需要为集成测试进行模拟吗?有时候,我们需要模拟一些引用SharePoint等外部服务的服务。如果您需要模拟,那么在这种情况下,您需要在spring上下文中模拟spring service bean。您可以通过
@MockBean

来完成。我关心的是,当我将调试在上,我讨论了executeJob()的实现,如果(!ruleSwitchService.isjobreexecutioneEnabled()),则这一行永远不要解析为true。我想模拟它。我编辑了我的问题。如果你现在能帮上忙的话,问题是你注入了两个对象,并尝试在注入的对象上改变一个方法。Mockito不能改变真实对象的方法。你必须创建一个模拟来改变,或者spy来注入依赖项,并在测试对象上使用
@InjectMocks
。你要这样做吗不要忘记使用
@RunWith(MockitoJUnitRunner.class)
或使用
Mockito.initMocks(this)初始化
如果您使用的是mock,那么它就不再是一个集成测试。因此,首先,您应该从MasterServiceIT类中删除it部分,仅从命名约定的角度来看。其次,正如@zlaval所提到的,您需要将这些注释以及mock注释放在serviceThree属性上。然后它就可以工作了。感谢@SebastianC.to poin如果你想创建一个集成测试,你必须设置容器并使用没有mockito的真实对象,在那里你不应该使用任何mock。如果这是你的目的,你可以通过
@springbootest
注释轻松地完成容器设置。但是从问题的上下文来看,我猜你想创建一个单元测试。我的concern是指在启用调试时,如果(!ruleSwitchService.isJobReexecutionEnabled()),我将访问executeJob()的实现和此行永远不要解析为true。我想模拟它。我编辑了我的问题。如果你现在能帮上忙的话,问题是你注入了两个对象,并尝试在注入的对象上改变一个方法。Mockito不能改变真实对象的方法。你必须创建一个模拟来改变,或者spy来注入依赖项,并在测试对象上使用
@InjectMocks
。你要这样做吗不要忘记使用
@RunWith(MockitoJUnitRunner.class)
或使用
Mockito.initMocks(this)初始化
如果您使用的是mock,那么它就不再是一个集成测试。因此,首先,您应该从MasterServiceIT类中删除it部分,仅从命名约定的角度来看。其次,正如@zlaval所提到的,您需要将这些注释以及mock注释放在serviceThree属性上。然后它就可以工作了。感谢@SebastianC.to poin如果你想创建一个集成测试,你必须设置容器并使用没有mockito的真实对象,在那里你不应该使用任何mock。如果这是你的目的,你可以通过
@springbootest
注释轻松地完成容器设置。但是从问题的上下文来看,我猜你想创建一个单元测试。