我有一个类似的类:如何重构类,以便可测试没有反射
public class QueueingCommandRunner {
private Status status;
private Map<Class<CommandHandler>, CommandHandler> queuedCommands;
private RunnerClass runnerClass;
private ExternalCommandRunnerRegistry externalCommandRunnerRegistry;
private ExternalCommandRunner externalCommandRunner;
public QueueingCommandRunner(ExternalCommandRunnerRegistry externalCommandRunnerRegistry,
RunnerClass runnerClass) {
this.externalCommandRunnerRegistry = externalCommandRunnerRegistry;
this.runnerClass = runnerClass;
this.queuedCommands = new LinkedHashMap<>();
this.status = Status.DOWN;
}
public void init() {
doSomeStuff();
externalCommandRunner = externalCommandRunnerRegistry.get(runnerClass);
externalCommandRunner.runListeningCommand(ListenableStatusCommand.class,
new ListenableStatusHandler(this::changeStatus));
}
public <T extends CommandHandler> void runCommand(Class<T> command, T commandHandler) {
if (status == UP) {
externalCommandRunner.run(command, commandHandler);
} else {
queuedCommands.put(command, commandHandler);
}
}
private void changeStatus(Status status) {
this.status = status;
if (status == UP) {
Iterator<Entry<Class<CommandHandler>, CommandHandler>> commandsIterator =
queuedCommands.iterator();
while (commandsIterator.hasNext()) {
<Entry<Class<CommandHandler>, CommandHandler>> queuedCommand = commandsIterator.next();
externalCommandRunner.run(queuedCommand.getKey(), queuedCommand.getValue());
commandsIterator.remove();
}
}
}
}
我忽略的东西一样同步。我的问题是,如何测试内部排队而不使用诸如通过反射调用私有方法之类的东西?特别是我想知道如何测试changeStatus
方法,因为它不是直接从这个类的任何公共方法运行。这个类是否由于设计而不好(从单元测试的角度来看)?
我使用的测试JMockit ...
单元测试时,您验证**所需的公共可观察行为**,即*返回值*和*与依赖关系*的通信与提供的输入有关。被测代码内部发生的任何事情都是*实现细节*,并未经过测试(直接)。这使您有机会在不改变测试的情况下将这些*实现细节*更改为更高效或更为理想的方法。 –