是否可以在我测试的类中控制全局变量的值? 全局变量在私有方法中使用,因此我使用公共方法(在同一个类中)来传递它。
我怎么说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;
}
答案 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)
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());
}
}