如何使用 JUnit4 测试无效方法?



所以我的代码看起来是这样(我知道我没有写减法规则,但忽略了这一点(: 该方法必须声明为(它是一个赋值(,我也实现了一个接口

public class RomanNumber implements Number {
public String roman;
public RomanNumber(String roman) {
this.roman = roman;
}
public void fromIntValue(int value) {
String roman ="";
if (value < 0) {
roman = " ";
}
while (value >= 1000) {
roman += "M";
value -= 1000;
}
while (value >= 500) {
roman += "D";
value -= 500;
}
while (value >= 100) {
roman += "C";
value -= 100;
}
while (value >= 50) {
roman += "L";
value -= 50;
}
while (value >= 10) {
roman += "X";
value -= 10;
}
while (value >= 5) {
roman += "V";
value -= 5;
}
while (value >= 1) {
roman += "I";
value -= 1;
}
this.roman=roman;
}

我的JUnit测试:

public void fromIntValue() {
RomanNumber rom = new RomanNumber("MMMCCLV");
rom.fromIntValue(3255);
Assert.assertEquals({"MMCCLV"},rom.fromIntValue(3255));
}

还有我的错误消息:

Error:(26, 54) java: 'void' type not allowed here

Unittest 验证公共可观察行为,即返回值(如果有(或与依赖项的通信

你的代码应该改变对象的内部状态
访问内部状态(存储转换数字的变量(将违反封装/信息隐藏,这是面向对象编程最重要的原则之一。

毕竟,对象状态的更改应该导致对象的公共可观察行为的更改。在您的情况下,应该有一个getter方法来公开内部存储的罗马数字。因此,您的测试应使用此getter来检索状态。

您将结果保存在名为roman的私有变量上,但在此之后不会在任何地方读取它。

fromIntValue方法仅用于触发转换而不返回最终结果(void返回(。这就是您收到错误的原因。

您需要创建一些方法来获取RomanNumber类的罗马值,例如getRoman方法:

public String getRoman() {
return this.roman;
}

因此,您的测试可以读取结果:

RomanNumber rom = new RomanNumber("MMMCCLV");
rom.fromIntValue(3255);
Assert.assertEquals("MMCCLV", rom.getRoman());

您将结果保存到私有成员中。为此,您需要使用 PowerMock 包的 getter 方法或 WhiteBox 类获取该成员。

  • 对于 getter 方法,请添加到该类中。
public String getRoman() {
return this.roman;
}
  • 使用白盒在方法调用后将以下语句添加到测试用例中。

字符串 roman = WhiteBox(rom,"roman"(;//返回 roman 成员的值 Assert.assertEquals("MMCCLV", roman(;

String roman = WhiteBox(rom,"roman");// return the value of roman member
Assert.assertEquals("MMCCLV", roman);

最新更新