最近在写单元测试的时候,出了用到了比较常用的mockito和powermock外(关于这两个工具的用法,可以参看这篇博客),还有用的一些其他的比较好用的工具类。
第一个就是Junit中了@Rule注解,它就像@Before,@After这些脚手架的注解一样,为了测试方法添加一些前置行为。例如为所有的测试添加一个timeout时间:
public class BlahTest {
@Rule
public Timeout timeout = new Timeout(2000);
@Test
public void testA() throws Exception {
// ...
}
@Test
public void testB() throws Exception {
// ...
}
}
或者创建一个临时目录:
public class BlahTest {
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
@Test
public void testIcon() throws Exception {
File icon = tempFolder.newFile("icon.png");
// do something else...
}
}
在我的测试了,我主要是用来的测试被测方法中的异常,通过使用@Rule,不但可以测试方法中的异常类型,还可以验证异常的message:
public class BlahTest {
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testIcon() throws Exception {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Dude, this is invalid!");
// do something that you expect to throw an exception...
}
}
同样用也可以定义自己的Rule,更多关于Junit Rule的东西,可以参看相关的wiki。
另一个比较有意思的工具就是Spring 4.2提供了ReflectionTestUtils,当被测试类中需要注入Spring Bean的时候,就可以使用这个工具类:
本测试类
public class Blah {
@Autowired
private BlahDao blahDao
public void someMethod() {
blahDao.callMethod();
//do someting others
}
}
测试方法
@Test
public void testMethod() {
BlahDao mockBlahDao = createMock(BlahDao.class);
ReflectionTestUtils.setField(blah, "blahDao", mockBlahDao);
......
}
在我的测试用,因为使用了mockito,所有通过@InjectMocks注解就可以实现Bean的注入,但对于@Value这样的属性注入,就只能使用ReflectionTestUtils了。
@Value("${importedFile.baseDir}")
private String baseDir;
ReflectionTestUtils.setField(testedClass, "baseDir", "/opt/xxxx/")