基于其他方法返回类型的单元测试布尔方法

时间:2019-09-18 19:43:26

标签: java unit-testing junit

单元测试的新手,正在寻找一种对布尔方法进行单元测试的方法,该方法已通过其他两个方法的结果进行了验证。

 protected boolean isUpdateNeeded(){ 
 return (method1() && method2()); 
}

在此示例中,其他方法如下所示。

protected boolean method1() { 
 return false; 
}

protected boolean method2() { 
 return true; 
} 

但是如果需要,可以重写这两种方法。如果这个时候真的很重要

所以我在测试背后的想法是这样的。找到一种方法将true / false传递给method1或method2,以满足所需的可能结果。

@Test
 public void testCheckToSeeIfUpdateIsNeeded(){ 
   assertTrue('how to check here'); 
   asserFalse('how to check here');
   assertIsNull('was null passed?');  

 }

2 个答案:

答案 0 :(得分:4)

如果另一个类对此进行了扩展并覆盖了method1和method2,则开发该类的人员有责任测试更改。

您可以模拟method1和method2,但是您随后将类的结构与测试用例结合在一起,这使得以后进行更改变得更加困难。

您在此处的职责是测试课程的行为。我看到有问题的方法称为isUpdateNeeded。因此,让我们测试一下。我将按照我的想象填写课程。

class Updater {
    Updater(String shouldUpdate, String reallyShouldUpdate) {...}
    boolean method1() { return shouldUpdate.equals("yes"); }
    boolean method2() { return reallyShouldUpdate.equals("yes!"); }
    boolean isUpdateNeeded() { ...}
}

class UpdaterTest {
    @Test
    void testUpdateIsNeededIfShouldUpdateAndReallyShouldUpdate() {
        String shouldUpdate = "yes";
        String reallyShouldUpdate = "yes!"
        assertTrue(new Updater(shouldUpdate, reallyShouldUpdate).isUpdateNeeded());
    }
    .... more test cases .....
}

请注意,在给定输入的情况下,此测试如何断言Updater的行为,而不是它与其他方法的存在之间的关系。

如果您希望测试演示您重写方法会发生什么,请在测试中子类化Updater并进行适当的更改。

答案 1 :(得分:2)

例如,您有上课:

public class BooleanBusiness {

  public boolean mainMethod(){
    return (firstBoolean() && secondBoolean());
  }

  public boolean firstBoolean(){
    return true;
  }

  public boolean secondBoolean() {
    return false;
  }

}

然后您可以编写如下测试:

import static org.junit.Assert.*;
import static org.mockito.Mockito.when;

import org.junit.Test;
import org.mockito.Mockito;

public class BooleanBusinessTest {

  @Test
  public void testFirstOption() {
    BooleanBusiness booleanBusiness = Mockito.spy(BooleanBusiness.class);
    when(booleanBusiness.firstBoolean()).thenReturn(true);
    when(booleanBusiness.secondBoolean()).thenReturn(true);
    assertTrue(booleanBusiness.mainMethod());
  }

  @Test
  public void testSecondOption() {
    BooleanBusiness booleanBusiness = Mockito.spy(BooleanBusiness.class);
    when(booleanBusiness.firstBoolean()).thenReturn(true);
    when(booleanBusiness.secondBoolean()).thenReturn(false);
    assertFalse(booleanBusiness.mainMethod());
  }
}