伙计们,我是JUnit测试的新手,并试图很好地掌握它,现在我正在为一个构造函数(用于创建有向图的有向图类)编写JUnit测试,该构造函数在读取负int值时抛出IllegalArgumentExctive,如果一切正常(节点值的数量)大于零,则创建一个图。
有向图类:
In in = new In();
public Digraph(In in) {
try {
this.nodes = in.readInt();
System.out.println("Total nodes in graph: "+ nodes);
if (nodes < 0) throw new IllegalArgumentException("Number of vertices must be > 0);
int E = in.readInt();
if (E < 0) throw new IllegalArgumentException("Number of edges must be >0);
}catch (NoSuchElementException e) {
throw new InputMismatchException("Invalid input format in Digraph constructor");
}
下面是我试图写的测试:
@Rule
public ExpectedException exception = ExpectedException.none();
@Test(expected = IllegalArgumentException.class)
public void DigraphIn() {
Digraph G = new Digraph(in.readInt());
exception.expect(IllegalArgumentException.class);
exception.expectMessage("Vertices can't be nagative");
exception.expectMessage("Invalid input format in Digraph constructor");
exception.expectMessage("Number of edges in a Digraph must be nonnegative");
try{
}catch (AssertionError e){
}
}
我应该如何使用一个(或两个)测试用例来测试这两个用例?如果“in”没有检测到-ve值,我就得到java。否则测试通过。提前谢谢
当你测试一个方法时,你实际上调用了它,这将使它执行。每个测试只能验证一个异常,因为该异常将取消方法的其余处理。因此,您需要对每个可能引发异常的位置进行一次测试。
当验证单元测试引发异常时,基本上有三种方法:
试抓块:
@Test
public void myTest() {
try {
myClass.myMethod(42);
fail();
} catch(final IllegalArgumentException e) {
assertEquals("something went wrong", e.getMessage());
}
}
@test
-注释的预期
-属性:
@Test(expected=IllegalArgumentException.class)
public void myTest() {
myClass.myMethod(42);
}
和ExpectedException
:
@Rule
public ExpectedException expectedException = ExpectedException.none();
@Test
public void myTest() {
expectedException.expect(IllegalArgument.class);
expectedException.expectMessage("something went wrong");
myClass.myMethod(42);
}
在你的例子中,你试图使用这三个。
如果我们比较测试异常的方法,只有第一种和第三种方法实际上能够对抛出的异常进行验证,这使得它们更适合测试可以从多个位置抛出相同类型异常的方法,然后您可以使用异常消息,以验证异常是否从您将其放置的位置引发。
第二个是迄今为止最可读的,但不允许您区分被测试方法引发的异常,在大多数情况下,它提供的值不如其他两个。
在第一和第三本书中,第三本是迄今为止最具可读性的,也是我个人的最爱。
由于被测试的方法每次执行只能引发一个异常,因此对于可能引发异常的每个位置,它都应该有一个测试方法:
public class DiagraphTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
private Diagraph diagraph;
private In in;
@Before
public void setup() {
in = mock(In.class);
}
@Test
public void constructorShouldThrowExceptionWhenNumberOfVerticesIsLessThanOne() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("vertices must be > 0"); //expectMessage only needs a substring of the exception-message
doReturn(-1).when(in).readInt();
new Diagraph(in);
}
@Test
public void constructorShouldThrowExceptionWhenNumberOfEdgesIsLessThanOne() {
expectedException.expect(IllegalArgumentException.class);
expectedException.expectMessage("edges must be > 0");
when(in.readInt()).thenReturn(42, -1);
new Diagraph(in);
}
//as to the last exception, I really can't see that it will ever be thrown in that try-block, but here's a test for that as well..
@Test
public void constructorShouldThrowInputMismatchExceptionIfReceivedNoSuchElementException() {
expectedException.expect(InputMismatchException.class);
expectedException.expectMessage("Invalid input format);
doThrow(new NoSuchElementException("phail")).when(in).readInt();
new Diagraph(in);
}
}
你应该有很多测试用例。每个异常都有一个是很好的。
您执行的每个测试都是不同的,应该以不同的方式对待。
一本很好的参考书是:Junit Cookbook。
事实上,我在你的代码中看到了一个错误。在你的测试案例中,你可以像下面这样嘲笑合作者。我做了一个模拟,在每次调用时使用“mockito”模拟库返回不同的值。
你基本上需要这样的东西:
@Test(expected = IllegalArgumentException.class)
public void DigraphInThatThrowsExceptionForVertices() {
In in = Mockito.mock(In.class);
when(in.readInt()).thenReturn(-1);
Digraph G = new Digraph(in);
fail();
}
@Test(expected = IllegalArgumentException.class)
public void DigraphInThatThrowsExceptionForEdges() {
In in = Mockito.mock(In.class);
when(in.readInt()).thenReturn(10).thenReturn(-1);
Digraph G = new Digraph(in);
fail();
}
@Test
public void DigraphInThatDoesNotThrowException() {
In in = Mockito.mock(In.class);
when(in.readInt()).thenReturn(10).thenReturn(15);
Digraph G = new Digraph(in.readInt());
}
这种方式测试代码更干净,易于阅读。
我正在为Junit编写测试,以测试我编写的删除函数: 此方法适用于同时具有前后节点的双链接列表。 问题是:我们的大学将针对我们编写的测试运行错误代码,以确定我们是否编写了足够的测试来捕获错误代码和异常。 我知道他们将运行的两个测试,但不知道错误的含义。 > 失败:缺少逻辑 故障:缺少NextNodeRepairLogic 这是我没有考虑的两个测试,因为我无法理解这些错误的含义。有人知道这些错误可能
我不能在HttpSession上进行模拟。测试方法如下所示: 测试结果如下所示: 我总是得到未经授权的例外,但我需要避免它。如何为会话添加一些参数来模拟工作?
我在Java EE托管bean中有以下代码: 其中facesContextProvider是一个用于返回faces上下文的自定义类(对于模拟测试很有用)。 我想知道如何使用Mockito在JUnit中测试这一点。我正在尝试以下方法的组合: 那么单元测试工具将是: 然后单元测试代码将是:
正如我的类名所暗示的那样:如果我的类是迭代器的实例,我想测试一下。因此,我想知道,如果它只需要实现接口就可以这样做,似乎就足够了。 然而,当我通过JUNIT Test运行以下类时,我得到了以下控制台输出: 似乎类构造函数被调用了两次!但是我不知道第二次调用来自哪里。我已经测试了“if”参数的变体以排除有故障,例如 然而,它在所有3种情况下都被调用了。因此,我假设Unit Test首先尝试,需要为自
首先请原谅我可能的无知,专业的做事方式对我来说很新鲜,如果有什么我没有提到的,请告诉我,我会尽力给你你需要的信息。。。 所以我试图用maven在Eclipse中构建我的webapp,我有一个测试套件 这很好,当我右键单击并以Junit test运行测试时,所有测试都通过了。 当我以Maven build的形式运行它,并以打包一系列测试为目标时,失败了??? 我的maven surefire插件配置