我在org.mockito.plugins.MockMaker文件中添加了mock-maker-inline文本,并将其放在test/resources/mockito-extensions中
在我的测试用例中,我正在使用:
System system = mock(System.class);
when(system.getProperty("flag")).thenReturn("true");`
但是我得到以下异常:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
Mocking methods declared on non-public parent classes is not supported.
2. inside when() you don't call method on mock but on some other object.
感谢任何建议
您还可以使用实际方法,在每次测试之前和之后准备和删除配置:
@Before
public void setUp() {
System.setProperty("flag", "true");
}
@After
public void tearDown() {
System.clearProperty("flag");
}
System.getProperty()
方法是静态的,为了模拟它,你需要使用 PowerMock。
下面是一个示例:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.junit.Assert.assertEquals;
@RunWith(PowerMockRunner.class)
@PrepareForTest(System.class)
public class ATest {
@Test
public void canMockSystemProperties() {
PowerMockito.mockStatic(System.class);
PowerMockito.when(System.getProperty("flag")).thenReturn("true");
assertEquals("true", System.getProperty("flag"));
}
}
这使用:
-
junit:junit:4.12
-
org.mockito:mocktio-core:2.7.19
-
org.powermock:powermock-api-mockito2:1.7.0
-
org.powermock:powermock-module-junit4:1.7.0
注意:@davidxxx建议通过将System
隐藏在立面后面来避免嘲笑这一点,这是非常明智的。避免需要模拟System
的另一种方法是在运行测试时实际将所需值设置为系统属性,系统规则提供了一种在 Junit 测试上下文中设置和取消系统属性期望的简洁方法。
Mockito(1 as 2(不提供模拟静态方法的方法。
因此,添加mockito-inline
对于模拟System.getProperty()
方法将毫无用处。
,模拟静态方法通常是一个坏主意,因为它会鼓励糟糕的设计。
在您的情况下,情况并非如此,因为您需要模拟您当然不能更改的 JDK 类。
所以你有两种方法:
使用 Powermock 或任何允许模拟静态方法的工具
将系统静态方法调用包装在提供实例方法的类中,例如
SystemService
.
最后一种方法实际上并不难实现,并且除了提供一种在您需要的地方注入此类实例的方法之外。
这比隐藏在两个语句之间的system.getProperty("flag")
语句生成更清晰的代码。