如何在unitTest中控制全局变量

时间:2014-08-14 09:26:01

标签: java variables junit

是否可以在我测试的类中控制全局变量的值? 全局变量在私有方法中使用,因此我使用公共方法(在同一个类中)来传递它。

我怎么说mListValService != null

public class Myclass {

  //my global variable
  private ListValServiceRemote listValService = null;

  public String getCodeValeurRef(Long idValeur) {
    return getListValService().getRlvCode(idValeur);

    // I want 100% coverage on this method so i have to change the value 
    // of mListValService.
    private ListValServiceRemote getListValService() {
      if (listValService == null) {
        listValService = ServiceGetter.getListValService();
      }
      return listValService;
    }

3 个答案:

答案 0 :(得分:1)

您可以将getListValService()方法公开为package-private,然后在测试中调用它。您可以确认每次都返回相同的值:

@Test
public void sameListValTest() {
  Myclass foo = // construct this somewhow

  assertTrue(foo.getListValService() == foo.getListValService());
}

这将为您提供100%的覆盖率,而无需摆弄私人领域。

或者您可以在测试中两次调用getCodeValeurRef()以获得相同的结果。导致getListValService()执行两次的任何内容都会为您提供100%的覆盖率。将其公开为package-private允许您验证您是否正在重复使用相同的字段,而不是每次都创建一个字段(如果这非常重要)。

答案 1 :(得分:1)

首先,您似乎没有使用IoC技术,因此在单元测试代码时遇到问题。

其次,私有是私有的,不要测试它。您的代码应仅使用公共方法进行测试和覆盖。如果某些代码无法通过公共接口访问,则根本无法访问。你为什么要测试呢?

如果您只调用getCodeValeurRef()两次,则可以轻松100%覆盖此特定代码。而且如果你有listValService == null,那么无论如何都会导致NullPointerException失败,所以不需要断言。

答案 2 :(得分:0)

来自spring-test的

ReflectionTestUtils可能是访问字段值的解决方案。您还可以使用普通旧反射,将getter / setter添加到字段或创建字段protected,并将测试放在与测试类相同的包中。

样品测试:

public class MyclassTest {
    private MyClass myClass;

    @Before
    public void setup() {
        this.myClass = new MyClass();
    }

    @Test
    public void testGetListValServiceWhenFieldIsNull() {
        assertNotNull(this.myClass.getListValService());
    }

    @Test
    public void testGetListValServiceWhenFieldIsNotNull() {
        final ListValServiceRemote  lvsr = new ListValServiceRemote();
        ReflectionTestUtils.setField(this.myClass, "listValService", lvsr);
        assertSame(lvsr, this.myClass.getListValService());
    }
}