首页 > 解决方案 > 模拟来自另一个类的对象

问题描述

我有一个启动服务的服务类。此服务应仅在特定时间之间启动。所以我需要模拟这个,但它不起作用。

我的时间课:

public  boolean isTimeBetween_00_06(){
     return Instant.now().isBefore(Instant.now()
    .truncatedTo(ChronoUnit.DAYS)
    .plus(6,ChronoUnit.HOURS));
}

我的服务类:

start(){
    if(! new MyTimeUtils().isTimeBetween_00_06){
        throw new Exception;
    }

}

我的测试课:

@InjectMocks
private MyServiceClass service;

@Mock
private MyTimeUtils myTimeUtils;

@Test
myTest(){

Mockito.when(myTimeUtils.isCurrentTimeBetween_00_06()).thenReturn(true);

service.start();

}

我希望我得到正确的断言,但它会随着 Exption 停止。

我也尝试过 PowerMockito,但它仍然没有用。

有人有想法吗?

此致。

标签: junitmocking

解决方案


您应该在方法中注入MyTimeUtils而不是创建实例。不要忘记@RunWith(MockitoJUnitRunner.class)

请看一下代码:

public class MyServiceClass {
    private final MyTimeUtils myTimeUtils;

    public MyServiceClass(MyTimeUtils myTimeUtils) {
        this.myTimeUtils = myTimeUtils;
    }

    public void start() {
        if (!myTimeUtils.isTimeBetween_00_06()) {
            throw new IllegalStateException("ERROR");
        }
    }
}

@RunWith(MockitoJUnitRunner.class)
public class MyServiceClassTest {
    @InjectMocks
    private MyServiceClass service;

    @Mock
    private MyTimeUtils myTimeUtils;

    @Test
    public void myTest(){
        Mockito.when(myTimeUtils.isTimeBetween_00_06()).thenReturn(true);

        service.start();
    }
}

推荐阅读