如何以惯用方式使用JUnit4来测试某些代码是否会抛出异常?
虽然我当然可以这样做:
@Test
public void testFooThrowsIndexOutOfBoundsException() {
boolean thrown = false;
try {
foo.doStuff();
} catch (IndexOutOfBoundsException e) {
thrown = true;
}
assertTrue(thrown);
}
Run Code Online (Sandbox Code Playgroud)
我记得有一个注释或一个Assert.xyz或者其他东西,对于这些类型的情况来说,远不如KUndgy 和JUnit的精神.
有人知道为什么JUnit 4提供assertEquals(foo,bar)
但不提供assertNotEqual(foo,bar)
方法吗?
它提供assertNotSame
(对应assertSame
)和assertFalse
(对应assertTrue
),所以看起来很奇怪他们没有打扰包括assertNotEqual
.
顺便说一句,我知道JUnit-addons提供了我正在寻找的方法.我只是出于好奇而问.
两者之间的主要区别是什么
@Before
和 @BeforeClass
@BeforeEach
和@BeforeAll
@After
和 @AfterClass
根据JUnit Api @Before
用于以下情况:
编写测试时,通常会发现多个测试需要在运行之前创建类似的对象.
而@BeforeClass
可用于建立数据库连接.但不能@Before
做同样的事情?
我想执行按@Test
特定顺序注释的测试方法.
例如:
public class MyTest {
@Test public void test1(){}
@Test public void test2(){}
}
Run Code Online (Sandbox Code Playgroud)
我希望确保test1()
在test2()
每次运行之前运行MyTest
,但我找不到像这样的注释@Test(order=xx)
.
我认为这对JUnit来说非常重要,如果JUnit的作者不想要订单功能,为什么?
我有一个maven程序,它编译得很好.当我运行mvn test
它时不会运行任何测试(在TESTs标题下说There are no tests to run.
).
我用一个超级简单的设置重新创建了这个问题,我将在下面包含以及运行时的输出-X
.
单元测试从eclipse运行良好(两者都使用默认的junit包,当我改为包含maven下载的junit.jar时).mvn也test-compile
正确地在test-classes下创建了类.我在OSX 10.6.7上使用Maven 3.0.2和java 1.6.0_24运行它.
这是目录结构:
/my_program/pom.xml
/my_program/src/main/java/ClassUnderTest.java
/my_program/src/test/java/ClassUnderTestTests.java
Run Code Online (Sandbox Code Playgroud)
pom.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my_group</groupId>
<artifactId>my_program</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>My Program</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Run Code Online (Sandbox Code Playgroud)
ClassUnderTest.java:
public class ClassUnderTest {
public int functionUnderTest(int n) {
return n;
}
}
Run Code Online (Sandbox Code Playgroud)
ClassUnderTestTests.java:
import org.junit.Assert;
import org.junit.Before; …
Run Code Online (Sandbox Code Playgroud) 我需要为一个设计很差的旧应用程序编写JUnit测试,并将大量错误消息写入标准输出.当getResponse(String request)
方法行为正确时,它返回XML响应:
@BeforeClass
public static void setUpClass() throws Exception {
Properties queries = loadPropertiesFile("requests.properties");
Properties responses = loadPropertiesFile("responses.properties");
instance = new ResponseGenerator(queries, responses);
}
@Test
public void testGetResponse() {
String request = "<some>request</some>";
String expResult = "<some>response</some>";
String result = instance.getResponse(request);
assertEquals(expResult, result);
}
Run Code Online (Sandbox Code Playgroud)
但是当它得到格式错误的XML或者不理解它返回的请求并将null
一些东西写入标准输出时.
有没有办法在JUnit中断言控制台输出?要抓住像这样的案例:
System.out.println("match found: " + strExpr);
System.out.println("xml not well formed: " + e.getMessage());
Run Code Online (Sandbox Code Playgroud) 好的,因此@Ignore
注释适用于标记不应运行测试用例.
但是,有时我想忽略基于运行时信息的测试.一个例子可能是我需要在具有一定数量内核的机器上运行并发测试.如果这个测试是在单处理器机器上运行的,我认为只是通过测试是不正确的(因为它还没有运行),并且当然不适合测试失败并打破构建.
所以我希望能够在运行时忽略测试,因为这似乎是正确的结果(因为测试框架将允许构建通过但记录测试未运行).我很确定注释不会给我这种灵活性,并且怀疑我需要手动为相关类创建测试套件.但是,文档没有提及任何关于这一点并且通过API查看它也不清楚如何以编程方式完成(即,我如何以编程方式创建Test
与@Ignore
注释创建的实例相似或相似的实例?).
如果有人在过去做过类似的事情,或者对如何做到这一点有一个明确的想法,我会很高兴听到它.
我想从命令行运行JUnit测试用例.我怎样才能做到这一点?
我正在使用Mockito 1.9.0.我想在JUnit测试中模拟一个类的单个方法的行为,所以我有
final MyClass myClassSpy = Mockito.spy(myInstance);
Mockito.when(myClassSpy.method1()).thenReturn(myResults);
Run Code Online (Sandbox Code Playgroud)
问题是,在第二行,myClassSpy.method1()
实际上是被调用,导致异常.我使用模拟的唯一原因是,以后,无论什么时候myClassSpy.method1()
被调用,都不会调用真正的方法并myResults
返回对象.
MyClass
是一个接口myInstance
,如果重要的话就是它的实现.
我需要做些什么来纠正这种间谍行为?
我是Mockito的新手.
鉴于下面的类,我如何使用Mockito来验证someMethod
在调用之后是否被调用了一次foo
?
public class Foo
{
public void foo(){
Bar bar = new Bar();
bar.someMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
我想进行以下验证通话,
verify(bar, times(1)).someMethod();
Run Code Online (Sandbox Code Playgroud)
在哪里bar
是一个模拟的实例Bar
.
junit ×10
java ×9
junit4 ×4
unit-testing ×4
assert ×2
mockito ×2
annotations ×1
command-line ×1
console ×1
exception ×1
ignore ×1
junit5 ×1
maven ×1
maven-3 ×1