标签: junit-rule

Junit @Rule如何运作?

我想为大量代码编写测试用例,我想知道JUnit @Rule注释功能的细节,以便我可以用它来编写测试用例.请提供一些好的答案或链接,通过一个简单的例子详细说明其功能.

java junit junit4 junit-rule

187
推荐指数
4
解决办法
12万
查看次数

Mockito在例外Junit 4.10之后验证

我正在测试一个带有预期异常的方法.我还需要验证在抛出异常之后调用了一些清理代码(在模拟对象上),但看起来忽略了验证.这是代码.我正在使用Junit ExpectedException Rule来验证预期的异常.

@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Test
public void testExpectedException()
{
   MockedObject mockObj = mock(MockedObj.class);
   MySubject subject = new MySubject(mockedObj);
   expectedEx.expect(MyException.class);
   expectedEx.expectMessage("My exception message.");
   subject.someMethodThrowingException();
   verify(mockObj).
       someCleanup(eq(...));
}
Run Code Online (Sandbox Code Playgroud)

似乎verify完全被忽视了.无论我放入什么方法verify,我的测试都是通过,这不是我想要的.

知道为什么会这样吗?

java junit mockito junit-rule

67
推荐指数
3
解决办法
5万
查看次数

为什么JUnit中的@Rule注释字段必须是公共的?

在JUnit测试用例中,注释的字段@Rule必须是公共的.它打破了常见的Java编码约定(所有类成员变量都不应该是公共的).为什么JUnit需要这个?

文档@Rule:https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/Rule.java

java junit public junit-rule

30
推荐指数
1
解决办法
4257
查看次数

在JUnit 4.11中结合@ClassRule和@Rule

在JUnit 4.10及更低版本中,可以将规则注释为@Rule和@ClassRule.这意味着规则在类之前/之后以及每次测试之前/之后被调用.这样做的一个可能原因是设置昂贵的外部资源(通过@ClassRule调用),然后便宜地重置它(通过@Rule调用).

从JUnit 4.11开始,@ Rule字段必须是非静态的,而@ClassRule字段必须是静态的,因此上述内容不再可能.

有明确的解决方法(例如,明确地将@ClassRule和@Rule职责分离为单独的规则),但是必须强制使用两个规则似乎是一种耻辱.我简要介绍了使用@Rule并推断它是否是第一个/最后一个测试,但我不相信这些信息是可用的(至少,它不能直接在描述中获得).

在JUnit 4.11的单个规则中是否有一种干净整洁的@ClassRule和@Rule功能组合方式?

谢谢,罗恩

java junit junit4 junit-rule

20
推荐指数
2
解决办法
9484
查看次数

如何在Junit 5中替换@Rule注释?

我在测试中使用Wiremock,并具有以下代码行:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8080);
Run Code Online (Sandbox Code Playgroud)

我想切换到Junit5。因此,我添加了下一个依赖项(使用gradle):

testCompile('org.junit.jupiter:junit-jupiter-engine:5.1.1')
Run Code Online (Sandbox Code Playgroud)

但是当我尝试导入@Rule注释时没有任何建议。我是否需要添加另一个依赖于junit的模块?还是Junit5不支持规则?如果没有,我该如何替换@Rule批注以使测试再次起作用?谢谢。

java junit-rule junit5

18
推荐指数
3
解决办法
9108
查看次数

在每个'@Test'之后和JUnit中的每个'@After'之前应用'@Rule'

我有一个测试套件,我将退出系统@After并关闭浏览器@AfterClass.我试图@Rule使用Selenium为每种测试方法拍摄失败的测试截图.我手动检查了@Rule只在每次之前运行,@Before但我想在@Test之前和之后设置它@After.我找不到简单的解决方案.任何帮助将不胜感激.

public class MorgatgeCalculatorTest  {

@Before
public void before(){
    System.out.println("I am before");
}
@BeforeClass
public static void beforeclass(){
    System.out.println("I am beforeclass");
}
@Test
    public void test(){
        System.out.println("I am Test");
    }
@Test
public void test2(){
    System.out.println("I am Test2");
}
@After
    public void after(){
        System.out.println("I am after");
    }
@AfterClass
        public static  void afterclass(){
            System.out.println("I am afterclass");

}
@Rule
ExpensiveExternalResource ExpensiveExternalResource = new ExpensiveExternalResource();

static class ExpensiveExternalResource implements MethodRule …
Run Code Online (Sandbox Code Playgroud)

java selenium webdriver junit4 junit-rule

17
推荐指数
2
解决办法
1万
查看次数

如果抛出JUnit ExpectedException后如何继续测试?

我已经使用ExpectedException功能设置了一些JUnit(4.12)测试,我希望测试在预期的异常之后继续.但是我从来没有看到日志'3',因为执行似乎在异常后停止,如果捕获事件?

这实际上是可能的,怎么样?

@Rule
public ExpectedException exception = ExpectedException.none();

@Test
public void testUserAlreadyExists() throws Exception {
    log.info("1");

    // Create some users
    userService.createUser("toto1");
    userService.createUser("toto2");
    userService.createUser("toto3");
    Assert.assertTrue( userService.userExists("toto1") );
    Assert.assertTrue( userService.userExists("toto2") );
    Assert.assertTrue( userService.userExists("toto3") );

    log.info("2");

    // Try to create an existing user
    exception.expect(AlreadyExistsException.class);
    userService.createUser("toto1");

    log.info("3");
}
Run Code Online (Sandbox Code Playgroud)

java junit4 expected-exception junit-rule

16
推荐指数
1
解决办法
1万
查看次数

JUnit Rule TemporaryFolder

我正在TemporaryFolder使用@RuleJUnit 4.7中的注释创建一个.我试图tempFolder.newFolder("someFolder")@Before我的测试的(设置)方法中创建一个新文件夹,它是临时文件夹的子文件.似乎临时文件夹在安装方法运行后被初始化,这意味着我无法在setup方法中使用临时文件夹.这是正确的(可预测的)行为吗?

java junit junit-rule

13
推荐指数
2
解决办法
1万
查看次数

仅在Windows上运行单元测试

我有一个通过JNA进行本机Windows API调用的类.如何编写将在Windows开发机器上执行但在Unix构建服务器上将被忽略的JUnit测试?

我可以轻松地使用主机操作系统 System.getProperty("os.name")

我可以在测试中编写保护块:

@Test public void testSomeWindowsAPICall() throws Exception {
  if (isWindows()) {
    // do tests...
  }
}
Run Code Online (Sandbox Code Playgroud)

这个额外的锅炉板代码并不理想.

或者,我创建了一个只在Windows上运行测试方法的JUnit规则:

  public class WindowsOnlyRule implements TestRule {
    @Override
    public Statement apply(final Statement base, final Description description) {
      return new Statement() {
        @Override
        public void evaluate() throws Throwable {
          if (isWindows()) {
            base.evaluate();
          }
        }
      };
    }

    private boolean isWindows() {
      return System.getProperty("os.name").startsWith("Windows");
    }
  }
Run Code Online (Sandbox Code Playgroud)

这可以通过将这个带注释的字段添加到我的测试类来强制执行:

@Rule public WindowsOnlyRule runTestOnlyOnWindows = new WindowsOnlyRule();
Run Code Online (Sandbox Code Playgroud)

这两种机制在我看来都是不足的,因为在Unix机器上它们会默默地传递.如果它们可以在执行时以某种方式用类似的东西标记它会更好@Ignore

有人有其他建议吗?

java junit junit-rule

13
推荐指数
2
解决办法
3745
查看次数

JUnit @Rule将参数传递给test

我想创建@Rule能够做这样的事情

@Test public void testValidationDefault(int i) throws Throwable {..}
Run Code Online (Sandbox Code Playgroud)

其中i是参数传递给测试的@Rule.

不过我确实得到了

java.lang.Exception: Method testValidationDefault should have no parameters
Run Code Online (Sandbox Code Playgroud)

有没有办法绕过它并在@Rule?中设置i参数?

java parameters junit junit-rule

12
推荐指数
3
解决办法
2万
查看次数