测试实现接口的类

时间:2014-04-09 18:13:19

标签: java interface instantiation

我已经为我的java课程设置了一个任务,包括创建一个基本的电话目录。我来到了涉及测试ArrayPhoneDirectory类中所有方法的部分,这个类实现了一个名为PhoneDirectory的接口。

我坚持如何在一个单独的测试器类中实例化ArrayPhoneDirectory类,因为我所做的每一次尝试都返回了错误,因为它是一个抽象类而无法实例化。

PhoneDirectory界面代码:

public interface PhoneDirectory {

/**
 * Load file containing directory entries
 *
 * @param sourceName is name of the file containing the directory entries
 */
void loadData(String sourceName);

/**
 * Look up an entry.
 *
 * @param name The name of person to look up
 * @return The telno or null if name is not in the directory
 */
String lookUpEntry(String name);

**CODE SNIPPED**

ArrayPhoneDirectory代码:

public abstract class ArrayPhoneDirectory implements PhoneDirectory {

private static final int INIT_CAPACITY = 100;
private int capacity = INIT_CAPACITY;

//holds telno of directory entries
private int size = 0;

//Array to contain directory entries
private DirectoryEntry[] theDirectory = new DirectoryEntry[capacity];

//Holds name of data file to be read
private String sourceName = null;

**CODE SNIPPED**

非常感谢有关实例化ArrayPhoneDirectory类的任何帮助,如果我需要添加更多代码,请发表评论,我还是相当新的!

3 个答案:

答案 0 :(得分:2)

在测试中创建一个扩展Abstract类的本地类。您将需要实现任何抽象方法。如果抽象方法中的逻辑不是很重要,那么你可以将它们留空。

答案 1 :(得分:0)

ArrayPhoneDirectory 抽象。您需要实现接口方法。

答案 2 :(得分:0)

我建议你首先阅读有关抽象类的内容,对我来说,ArrayPhoneDirectory看起来不应该是抽象的:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

关于你真正的问题:我建议你使用除JUnit之外的模拟框架,而不是实现接口/抽象类。我自己使用mockito,可以在StackOverflow找到关于如何测试抽象类的提示。您的测试看起来很简单:

import static org.mockito.Mockito.*;

PhoneDirectory directory = mock(ArrayPhoneDirectory.class, CALLS_REAL_METHODS);
directory.someImplementedMethod();

使用模拟框架,您可以定义对测试中涉及的任何内容的调用的操作,这实际上不是您正在测试的类。这样你就可以真正测试一个小单元而不是最终完成一个完整的功能测试。另外,使用模拟,您可以根据测试环境中不易获得的对象来测试类。