温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

发布时间:2020-08-13 13:43:08 阅读:209 作者:i042416 栏目:编程语言
Java开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

Suppose you need to repeatedly execute some test method in your unit test case, for example, you would like to test getPrice based on the first set of test data 5 times in test method test1() while for the second set of test data, only one time should be executed.

The below class RepeatDemoOne is a bad example, where this special LOOP operation is mixed with test method implementation.

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

Ideally the test method should only contain the pure logic to operate on the method being tested. So we have a better solution RepeatDemoTwo: It could easily be observed that now the test method test1 and test2 are rather clean: no more for LOOP and System.out.println exist any more.

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

Instead, I put the LOOP logic and print out operation into class RepeatableRule which implements interface MethodRule. The concrete rule implementation is done by overriding method apply as below:

class RepeatableRule implements MethodRule{  
    int times = 1;  
    String[] testMethods = null;  
    RepeatableRule(int times, String[] testMethods){  
        this.times = times;  
        this.testMethods = testMethods;  
    }  
    @Override  
    public Statement apply(final Statement base, final FrameworkMethod method, Object target) {  
      return new Statement() {  
         @Override  
         public void evaluate() throws Throwable {  
            int loopTime = 1;  
            if(Arrays.asList(testMethods).contains(method.getName())) {  
                loopTime = times;  
            }    
            for(int i = 0; i < loopTime; i++ ) { 
                base.evaluate(); 
                System.out.println(method.getName() + " executed.");
            }
         }  
      };  
    }  }

When I execute this test case, I can get exactly the same result as RepeatDemoOne:

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

With the help of @Rule, we can achieve the same as @Test(expected=).

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

For example, we can use an instance of class ExpectedException to manually declare within a test method itself that a test method expects a given type of exception class.

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

Besides exception, we can also manually specify a sub string which is expected to appear in an error message, and add our custom error message in Junit report if a test method fails. See following code for example:

public class RuleWithException {
    @Rule
    public ExpectedException exp = ExpectedException.none();
    @Test
    public void expectMessage()
    {
        exp.expectMessage("Hello World");
        throw new RuntimeException("Hello World will throw exception.");
    }
    @Test
    public void expectCourse()
    {
        exp.expectCause(new BaseMatcher<IllegalArgumentException>()
        {
            public boolean matches(Object item)
            {
                return item instanceof IllegalArgumentException;
            }
            @Override
            public void describeTo(org.hamcrest.Description description) {
                description.appendText("Expected exception with type IllegalArgumentException "
                        + "raised in test method! ");
            }
        });
        Throwable cause = new IllegalArgumentException("Cause Test.");
        throw new RuntimeException(cause);
    }}

In this example, if we comment out line 46, the customed message defined in method describeTo will be printed out in JUnit console:

使用Java JUnit框架里的@SuiteClasses注解管理测试用例 使用Java JUnit框架里的@SuiteClasses注解管理测试用例

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

使用Java JUnit框架里的@SuiteClasses注解管理测试用例

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

原文链接:http://blog.itpub.net/24475491/viewspace-2703835/

AI

开发者交流群×