在单元测试中一些有用的工具类

最近在写单元测试的时候,出了用到了比较常用的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/")

你可能感兴趣的:(在单元测试中一些有用的工具类)