Java 如何使用JUnit4测试void方法?

Java 如何使用JUnit4测试void方法?,java,unit-testing,methods,junit,void,Java,Unit Testing,Methods,Junit,Void,因此,我的代码看起来是这样的(我知道我没有编写减法规则,但忽略了这一点): 该方法必须声明为so(它是一个赋值),并且我还实现了一个接口 public class RomanNumber implements Number { public String roman; public RomanNumber(String roman) { this.roman = roman; } public void fromIntValue(int value) { S

因此,我的代码看起来是这样的(我知道我没有编写减法规则,但忽略了这一点): 该方法必须声明为so(它是一个赋值),并且我还实现了一个接口

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;
    }
以及我的错误消息:

Error:(26, 54) java: 'void' type not allowed here
Unittest验证公共可观察行为,即返回值(如果有)或与依赖项的通信

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


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

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

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

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

public String getRoman() {
     return this.roman;
}
因此,您的测试可以读取结果:

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

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

  • 对于getter方法,将其添加到该类中
  • 在方法调用之后,使用WhiteBox将以下语句添加到测试用例中
字符串roman=白盒(rom,“roman”);//返回罗马成员的值 Assert.assertEquals(“MMCCLV”,罗马)


将此方法设置为
void
是没有意义的。“它应该做什么?”kaya3我知道,但我的教授要求这样做。否则它将与字符串一起工作。我还有一个实现到类的接口,该接口也是无效的,该方法应该做什么?@kaya3将阿拉伯数字转换为罗马数字,并将新值设置为对象实例的值,并将新值设置为对象实例的值-因此您的方法编写不正确。它应该改变对象的状态,而不是创建一个新对象(因为它没有返回,所以没有效果)。如果您能通过链接文档(或其他类型的信息)来支持它,那就太好了。@carloswm85我所知道的关于这个主题的最佳资源是一些书籍:,和
RomanNumber rom = new RomanNumber("MMMCCLV");
rom.fromIntValue(3255);
Assert.assertEquals("MMCCLV", rom.getRoman());
public String getRoman() {
     return this.roman;
}
String roman = WhiteBox(rom,"roman");// return the value of roman member
Assert.assertEquals("MMCCLV", roman);