我是Mockito的新手,想在单元测试中使用它.
我不喜欢的是为没有明确定义行为的方法创建的Mockito.mock(Class<T>)返回默认值(如null)的模拟.相反,我希望他们在这种情况下抛出一个异常,所以我知道我需要添加这个定义.
我尝试了以下方法:
SomeType m = mock( SomeType.class, new ThrowsException( new SomeRuntimeException( ... ) ) );
when( m.a() ).thenReturn( ... );
m.a(); // ok
m.b(); // throws exception
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为在调用期间已经抛出了异常when().
有没有其他方法来实现这一目标?
我一直在阅读有关参数捕获者的内容,我读的越多,我就越迷失.有人可以用一个例子解释它的痛苦吗?
我有一个像下面这样的方法,
public void generateCSVFile(final Date billingDate) {
asyncTaskExecutor.execute(new Runnable() {
public void run() {
try {
accessService.generateCSVFile(billingDate);
} catch (Exception e) {
LOG.error(e.getMessage());
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
我嘲笑:
PowerMockito.doNothing().when(accessService).generateCSVFile(billingDate);
Run Code Online (Sandbox Code Playgroud)
但是当我验证时:
verify(rbmPublicViewAccessService, timeout(100).times(1)).generateCSVFile(billingDate);
Run Code Online (Sandbox Code Playgroud)
它给了我没有被调用.这是因为它是通过单独的线程调用的,是否可以验证在不同线程中调用的方法?
pom.xml为了让PowerMock与Mockito合作,我需要添加哪些罐子?我有以下依赖项:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-support</artifactId>
<version>1.4.11</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是当我@PrepareForTest在类级别添加注释时,Eclipse无法找到它,但它可以找到PowerMockito.我错过了什么罐子?
我有一个类(ClassA)来获取目录中的文件.它扫描给定目录中与正则表达式匹配的文件.对于每个匹配的文件,它将文件对象添加到列表中.处理完目录后,它会将文件列表传递给另一个类(ClassB)进行处理
我正在为ClassA编写单元测试,因此使用Mockito模拟ClassB,并将其注入ClassA.然后我想在不同的场景中验证传递给ClassB的列表的内容(即我的模拟)
我已经将代码删除了以下内容
public class ClassA implements Runnable {
private final ClassB classB;
public ClassA(final ClassB classB) {
this.classB = classB;
}
public List<File> getFilesFromDirectories() {
final List<File> newFileList = new ArrayList<File>();
// ...
return newFileList;
}
public void run() {
final List<File> fileList = getFilesFromDirectories();
if (fileList.isEmpty()) {
//Log Message
} else {
classB.sendEvent(fileList);
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试类看起来像这样
@RunWith(MockitoJUnitRunner.class)
public class AppTest {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Mock
private ClassB mockClassB;
private File testFileOne;
private File …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个由模拟对象抛出的JsonProcessingException.
when(mapper.writeValueAsString(any(Object.class))).thenThrow(new JsonProcessingException("Error"));
Run Code Online (Sandbox Code Playgroud)
但是我无法创建JsonProcessingException对象,因为所有构造函数都受到保护.我该如何解决这个问题?
doThrow()和之间有什么区别thenThrow()?
假设我们想要模拟身份验证服务来验证用户的登录凭据.如果我们要模拟异常,以下两行之间的区别是什么?
doThrow(new BadCredentialsException("Wrong username/password!")).when(authenticationService).login("user1", "pass1");
Run Code Online (Sandbox Code Playgroud)
VS
when(authenticationService.login("user1", "pass1")).thenThrow(new BadCredentialsException("Wrong username/password!"));
Run Code Online (Sandbox Code Playgroud) 我有以下简单的代码.我有一个类(TestClass),我想测试"someMethod".有一个外部静态方法,由我的"someMethod"调用.我想Powermock那个静态方法给我一些虚拟对象.我在开头有@PrepareForTest(ExternalClass.class),但是当我执行它时会给出错误:
ExternalClass类没有准备好进行测试.要准备此类,请将类添加到'@PrepareForTest'注释中.如果您不使用此批注,请在类或方法级别添加批注.
请帮我指出我使用的方式有什么问题 @PrepareForTest
@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalClass.class)
public class xyzTest {
@Mock
private RestTemplate restTemplate;
@Mock
private TestClass testClass;
@BeforeClass
private void setUpBeforeClass() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testSuccessCase() {
Boolean mockResponse = true;
ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK);
SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData");
PowerMockito.mockStatic(ExternalClass.class);
Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response);
Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass);
Boolean result = testClass.someMethod("test");
Assert.isTrue(result);
Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any());
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试验证我正在测试的类调用正确的依赖类的方法.所以我试图匹配方法参数,但我并不真正关心这个测试中的实际值,因为我不想让我的测试变脆.
但是,我遇到了麻烦,因为Mockito决定我期待的行为是一个错误:https://github.com/mockito/mockito/issues/134
那么为可能为null的参数定义匹配器的正确方法是什么?
问题#134"已修复",此代码失败,因为匹配器仅在第一种情况下匹配.如何在所有4种情况下定义匹配器?
MyClass c = mock(MyClass.class);
c.foo("hello", "world");
c.foo("hello", null);
c.foo(null, "world");
c.foo(null, null);
verify(c, times(4)).foo(anyString(), anyString());
Run Code Online (Sandbox Code Playgroud) 有没有什么办法可以在junit中测试时模拟静态util方法?
我知道Powermock可以模拟静态调用; 但我不想使用Powermock.
还有其他选择吗?