我想为大量代码编写测试用例,我想知道JUnit @Rule注释功能的细节,以便我可以用它来编写测试用例.请提供一些好的答案或链接,通过一个简单的例子详细说明其功能.
我正在测试一个带有预期异常的方法.我还需要验证在抛出异常之后调用了一些清理代码(在模拟对象上),但看起来忽略了验证.这是代码.我正在使用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,我的测试都是通过,这不是我想要的.
知道为什么会这样吗?
在JUnit测试用例中,注释的字段@Rule必须是公共的.它打破了常见的Java编码约定(所有类成员变量都不应该是公共的).为什么JUnit需要这个?
文档@Rule:https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/Rule.java
在JUnit 4.10及更低版本中,可以将规则注释为@Rule和@ClassRule.这意味着规则在类之前/之后以及每次测试之前/之后被调用.这样做的一个可能原因是设置昂贵的外部资源(通过@ClassRule调用),然后便宜地重置它(通过@Rule调用).
从JUnit 4.11开始,@ Rule字段必须是非静态的,而@ClassRule字段必须是静态的,因此上述内容不再可能.
有明确的解决方法(例如,明确地将@ClassRule和@Rule职责分离为单独的规则),但是必须强制使用两个规则似乎是一种耻辱.我简要介绍了使用@Rule并推断它是否是第一个/最后一个测试,但我不相信这些信息是可用的(至少,它不能直接在描述中获得).
在JUnit 4.11的单个规则中是否有一种干净整洁的@ClassRule和@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批注以使测试再次起作用?谢谢。
我有一个测试套件,我将退出系统@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) 我已经使用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) 我正在TemporaryFolder使用@RuleJUnit 4.7中的注释创建一个.我试图tempFolder.newFolder("someFolder")在@Before我的测试的(设置)方法中创建一个新文件夹,它是临时文件夹的子文件.似乎临时文件夹在安装方法运行后被初始化,这意味着我无法在setup方法中使用临时文件夹.这是正确的(可预测的)行为吗?
我有一个通过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
有人有其他建议吗?
我想创建@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 ×10
junit-rule ×10
junit ×7
junit4 ×4
junit5 ×1
mockito ×1
parameters ×1
public ×1
selenium ×1
webdriver ×1