2010-03-16 290 views
0

你好,我书面方式JUnit测试这部分该如何测试这个方法..这仅仅是这个方法的一部分:如何测试的代码

public MyClass{ 

public void myMethod(){ 
List<myObject> list = readData(); 
} 
} 

我将如何弥补这方面的测试? ReadData是MyClass中的私有方法?

+1

我认为你需要扩展你的例子。就目前而言,该方法根本没有可见的行为(除了返回),所以没有什么可以测试的。 – 2010-03-16 15:48:35

+0

'readData'是否修改MyClass实例的状态?如果是这样,你应该测试改变的状态。如果没有,我不明白'readData'是做什么的。 – 2010-03-16 15:50:04

+0

列表是错误的。您应该在尖括号之间指定一个类,例如列表。 – 2010-03-16 16:38:47

回答

0

正如所写,测试myMethod()没有意义,除非readData()按照Frank Grimm提到的方式更改实例状态。有一件事要做的是改变myMethod(),以便将list放入List实例变量中。那么你可能会做这样的事情:

@Test 
public void testThatReadDataReturnsACorrectList(){ 
    MyClass inst = new MyClass(); // Add args to ctor call if needed - maybe a file path that readData() will use? 
    inst.myMethod(); 

    // Create a list of MyClasses that match what you expect readData() to return: 
    List<MyClass> expectedList = new List<>(); 
    expectedList.Add(new MyClass(/* Some arguments */)); 
    expectedList.Add(new MyClass(/* Some more arguments */)); 
    expectedList.Add(new MyClass(/* Some other arguments */)); 

    // Assert that the list you created matches the list you get back from 
    assertArrayEquals("Did not get the list expected", expectedList.ToArray(), inst.getList().ToArray()); 

} 

你仍然不得不写MyClass.getList()返回List实例变量。

为了增强可用性,您可以使MyClass构造函数接受一个实现类似IMyReadInterface的接口的对象。 readData()将使用该对象。然后在你的测试中,你可以实例化一个也实现了IMyReadInterface的模拟,配置模拟以提供所需的数据以便readData()正常工作,并且用该模拟构建inst

1

您可以随时测试List对象以查看它是否包含readData()应该插入到列表中的所有元素。创建一个返回列表的公共方法,您可以将该列表中的长度和元素与您期望在其中的内容进行比较。

0

除非我们对方法有更多的了解,否则您真正需要测试的是从readData返回的格式适合您的通用列表。否则,如果不知道私有方法中发生了什么,就很难推荐任何东西。