`
JerryWang_SAP
  • 浏览: 1035973 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

JUnit 注解@Rule的工作原理

阅读更多

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.

 

 

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.

 

 

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:

 

 

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

 

 

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.

 

 

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:

 

 

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

0
2
分享到:
评论

相关推荐

    在JUnit中使用@Rule测试文件和目录Java开发Ja

    在实际开发中,`@Rule`还可以与其他JUnit注解一起使用,如`@BeforeClass`和`@AfterClass`,以确保测试类级别的资源管理。例如,可以创建一个`ClassRule`来初始化一次性的测试环境,如数据库连接池。 总的来说,通过...

    MyBatis 需要注意的地方junit注解

    1.junit 常用注解 @Before 初始化方法,每次测试方法调用前都执行一次。 @After 释放资源:每次测试方法调用后都执行一次 @Test 测试方法:在这里可以测试期望异常和超时时间 @ignore 忽略的测试方法 @BeforeClass ...

    探索JUnit4扩展:使用Rule

    在实际开发中,理解`@Rule`的工作原理并结合源码阅读,可以进一步提高我们对JUnit的理解,从而更好地利用这个强大的工具。 至于压缩包文件“JunitStudy”,可能包含了示例代码、讲解文档或者练习项目,用于辅助学习...

    探索JUnit4扩展:深入Rule

    Rule的使用非常简单,只需在测试类中声明一个Rule字段,并在需要应用该规则的方法上使用`@Rule`注解。例如,JUnit自带的`ExpectedException` Rule可以帮助我们捕获和验证预期的异常: ```java import org.junit....

    Junit简介和扩展

    JUnit4在JUnit3的基础上进行了大量改进,特别是通过使用Java 5的注解特性来简化测试用例的编写。 1. **无需继承TestCase**:JUnit4不再要求测试类必须继承`TestCase`类。 2. **测试方法标识**:使用`@Test`注解来...

    junit4测试源码

    这个"junit4测试源码"可能包含了JUnit4框架的源代码,使得用户能够深入理解其内部工作原理,便于自定义扩展或学习测试驱动开发(TDD)的最佳实践。 首先,JUnit4引入了注解(Annotation)的概念,使得测试类和测试...

    Junit资源包(4.3.1)

    提供源代码可以让开发者深入理解JUnit的内部工作原理,查看和学习其设计模式和实现细节。对于想要扩展JUnit或者对测试框架感兴趣的开发者来说,源代码是非常宝贵的资源。 **5. 使用步骤**: - **导入JUnit库**:将...

    junit3.8 和junit4 api

    在JUnit 3中,初始化和清理工作是通过`setUp()`和`tearDown()`方法实现的,它们会在每个测试方法之前和之后自动调用。 4. **测试套件(Test Suites)**:通过`@Suite`注解创建,但这是JUnit 4的特性。在JUnit 3中,...

    注解的在junit总的使用模拟.rar

    通过学习和应用这些JUnit注解,开发者不仅可以提高测试的效率,还能确保代码的质量和可维护性。记住,良好的测试习惯是软件工程中不可或缺的一部分,尤其是在大型项目中,单元测试能够帮助我们早发现、早修复问题,...

    junit-4.12.jar下载

    此外,JUnit 4.12还支持了注解`@Rule`,允许自定义测试规则,如`TestWatcher`,它可以在测试开始、结束、成功或失败时执行自定义代码。 在实际开发中,JUnit通常与其他工具一起使用,如`Maven`或`Gradle`构建系统,...

    Junit测试学习文档

    3. 测试注解:@Test注解标记的方法会由Junit运行器执行,如果方法内部抛出异常,测试失败;如果没有异常且返回值符合预期,则测试成功。 4. 断言:Junit提供了多种断言方法,如assertEquals()、assertTrue()等,用于...

    junit4测试jar包

    8. **规则(Rules)**:JUnit4引入了规则(Rules)的概念,允许自定义测试行为,如使用`@Rule`注解配合`ExternalResource`实现资源的生命周期管理。 9. **假设(Assumptions)**:`Assume`类提供了方法,可以在测试...

    android junit4

    在Android开发中,JUnit4是一个不可或缺的单元测试框架,它使得开发者...通过掌握JUnit4的使用,以及与其他测试工具如Mockito和Espresso的配合,你可以更有效地进行Android应用的测试工作,确保产品的稳定性和可靠性。

    junit4.1.zip

    JUnit 4.1引入了测试监听器的概念,通过实现`TestListener`接口或使用`@Rule`注解,可以定制测试的执行过程,如记录测试日志、捕获系统快照等。 8. **延迟与假设** `Assume`类提供了一组方法,允许在测试开始前...

    junit-4.11.jar

    4. **可扩展性**:JUnit 4.11允许用户自定义规则(Rules),通过@Rule注解,可以创建复杂的测试行为,如临时文件管理、超时控制等。 5. **分类(Categories)**:新增了测试分类功能,开发者可以将测试分为不同的...

    JUnit4JUnit4JUnit4(文档)

    对于需要在每个测试之前或之后执行的复杂逻辑,可以使用 `@ClassRule` 和 `@Rule` 注解结合 `ExternalResource` 类实现。 10. **测试注解的继承**: 如果一个类被 `@RunWith` 或其他测试注解标记,那么它的子类将...

    junit4.10下载

    同时,JUnit 4.10也支持使用`@Rule`注解来定义自定义的测试规则,比如`TestWatcher`,可以在测试开始前和结束后执行自定义行为。 最后,JUnit 4.10 可以与其他流行的Java工具和库无缝集成,如Maven、Gradle、...

    Junit4.4&3.8.1.rar

    本资源包含了JUnit的两个主要版本——4.4和3.8.1的源码和帮助文档,这对于学习和理解JUnit的工作原理以及历史演变非常有帮助。 JUnit 3.8.1是较早的一个版本,其核心特性包括: 1. **注解(Annotations)**:虽然...

    Junit设计模式分析

    《Junit设计模式分析》这本书深入探讨了如何在单元测试框架Junit中巧妙地应用设计模式,以提高代码的可测试性...《Junit设计模式分析》这本书详细解析了这些模式在实际测试工作中的应用,是提升测试技能的宝贵资源。

    junit4.4的最新版本

    在本文中,我们将深入探讨JUnit 4.4这个特定版本,它是JUnit系列的一个重要里程碑,引入了许多增强功能和改进,使得测试工作更为高效。 JUnit 4.4的发布标志着该框架在向更现代化、更灵活的方向迈进。以下是这个...

Global site tag (gtag.js) - Google Analytics