Java 有没有办法避免在Spring框架中创建大量接口和类?
我的发展模式如下:Java 有没有办法避免在Spring框架中创建大量接口和类?,java,spring,tdd,Java,Spring,Tdd,我的发展模式如下: 我需要功能 我创建了一个接口 我创建了一个实现该接口的空类 我通过TDD(使用Mockito)构建实现,遵循步骤1到步骤3实现它所依赖的功能 这将导致使用单个实现类的大量接口。有没有捷径,更好的方法 更新 根据这些评论,我发现Mockito可以用来模拟类(不要嘲笑我)。我做了一个小实验。以下是UML: 以下是相关代码(所有类,无接口): 因此,使用Mockito,我能够在没有单个接口的情况下测试MessageWriter.writeMessage() public cla
更新 根据这些评论,我发现Mockito可以用来模拟类(不要嘲笑我)。我做了一个小实验。以下是UML: 以下是相关代码(所有类,无接口): 因此,使用Mockito,我能够在没有单个接口的情况下测试MessageWriter.writeMessage()
public class MessageWriterTest {
@Test
public void testWriteMessage() {
MessageGetter mockMessageGetter = mock(MessageGetter.class);
MessageDisplayer mockMessageDisplayer = mock(MessageDisplayer.class);
String mockMessage = "Mock Hello";
when(mockMessageGetter.getMessage()).thenReturn(mockMessage);
MessageWriter messageWriter = new MessageWriter();
messageWriter.setMessageGetter(mockMessageGetter);
messageWriter.setMessageDisplayer(mockMessageDisplayer);
messageWriter.writeMessage();
verify(mockMessageDisplayer).displayMessage(mockMessage);
}
}
我在Spring框架中创建接口已经很长时间了,我不知道不这样做是否合适。停下来可以吗?好吧,看起来使用Spring和Mockito时生活会更简单。我已经进一步简化了我在问题中发布的代码。其基本思想是:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.5.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.2.5.RELEASE</version>
</dependency>
下面是我正在测试的类:
public class MessageWriter {
@Autowired
private MessageGetter messageGetter;
@Autowired
private MessageDisplayer messageDisplayer;
public void writeMessage() {
String message = messageGetter.getMessage();
messageDisplayer.displayMessage(message);
}
}
下面是测试:
@RunWith(MockitoJUnitRunner.class)
public class MessageWriterTest {
@Mock
private MessageGetter mockMessageGetter;
@Mock
private MessageDisplayer mockMessageDisplayer;
@InjectMocks
private MessageWriter messageWriter;
@Test
public void testWriteMessage() {
String mockMessage = "Mock Hello";
when(mockMessageGetter.getMessage()).thenReturn(mockMessage);
messageWriter.writeMessage();
verify(mockMessageDisplayer).displayMessage(mockMessage);
}
}
虽然编码与接口往往是一个好主意,但实际上没有人强迫你这么做。上述步骤实际上都不需要接口。您可以在没有接口的情况下连接bean,您可以模拟类(只要它们不是
final
)。。。。在进行单元测试时,您可以在许多情况下使用具体的实现。您不需要模拟每个协作者。我的大型Spring web应用程序没有很多接口和类。@Raedwald(1)您需要模拟协作者,以便控制它们返回的内容,我认为您在单元测试方面所说的没有意义,以及(2)你的大型SpringWeb应用程序怎么可能没有很多类呢?你的代码在哪里?
public class MessageWriter {
@Autowired
private MessageGetter messageGetter;
@Autowired
private MessageDisplayer messageDisplayer;
public void writeMessage() {
String message = messageGetter.getMessage();
messageDisplayer.displayMessage(message);
}
}
@RunWith(MockitoJUnitRunner.class)
public class MessageWriterTest {
@Mock
private MessageGetter mockMessageGetter;
@Mock
private MessageDisplayer mockMessageDisplayer;
@InjectMocks
private MessageWriter messageWriter;
@Test
public void testWriteMessage() {
String mockMessage = "Mock Hello";
when(mockMessageGetter.getMessage()).thenReturn(mockMessage);
messageWriter.writeMessage();
verify(mockMessageDisplayer).displayMessage(mockMessage);
}
}