如何使用Mockito在服务内部的私有方法内引发错误

时间:2018-10-09 09:50:31

标签: java spring testing mockito

我在尝试进行一些自动化测试时遇到问题:我有一项服务(春季)。该服务提供了用于过程的公共方法。此过程由3个底层过程组成。这些进程使用私有方法,并正在调用其他服务。

我想测试这3个私有进程之一抛出错误时的行为。我发现Mockito可以帮助我。但是我不能使它工作。由于我的三个方法都是私有方法,因此无法使用PowerMock,因此我尝试在其他服务的公共方法上使用when()。thenThrow,这是由我的私有方法调用的。

我得到了各种各样的结果,NullPointerException,进程正常工作,没有任何抛出/错误,依赖项问题等。

我的代码如下:

 @Test
public void test() throws Throwable {
    Mockito.when(SecondServiceCalledByPrivateMethod.publicMethod(Mockito.any(), Mockito.any()))
            .thenThrow(new Exception("failed!!!"));
    request lRequest = createRequest(myObjects);

    FirstService.executeProcess(lRequest);
}

使用配置类:

@Configuration
public class ConfigClass{

    @Bean
    @Primary
    public SecondService secondService() {
        return Mockito.mock(SecondService.class);
    }

}

内部服务中,我有多个@Autowired等。我不知道这是否重要。这是我第一次尝试使用Mockito。 您是否知道如何使它起作用或我缺少什么?

编辑:我的服务如下:

@Service
class MyService {
    @Autowired OtherService dependentService;

    public someObject serviceMethod(Object2) {
        //Some actions
        callProcess(Object2);
    }
    private void callProcess(Object2) {
        // other actions
        dependentService.process(Object3);
    }
}

它有多个对其他服务的调用(@Autowired)。我需要在测试中模拟/监视他们吗?

1 个答案:

答案 0 :(得分:0)

您不能真正使服务的私有方法本身抛出异常。

用于这种事情的一般概念是模拟依赖项。

@Service
class MyService {
    @Autowired OtherService dependentService;

    public void serviceMethod() {
        callProcess();
    }
    private void callProcess() {
        dependentService.process();
    }
}

@RunWith(MockitoRunner.class)
public class MyServiceTest {
    // will be injected into the tested service by mockito
    @Mock private OtherService dependentService;
    @InjectMocks private MyService tested;

    @Test
    public void testExceptionOnCallProcess() {
        // mock the exception being thrown by the other service
        when(dependentService.process()).thenThrow(new RuntimeException());
        tested.serviceMethod();
    }
}

您使用自己的配置正在做的是创建一个实际的Spring上下文-这将使其成为集成测试,并且由于其中没有模拟,因此无法创建模拟异常。您必须通过创建环境来触发事件,然后通过相应地设置环境和数据来抛出事件。