gpt4 book ai didi

java - 有没有办法避免在 Spring 框架中创建大量接口(interface)和类?

转载 作者:行者123 更新时间:2023-11-30 08:39:50 24 4
gpt4 key购买 nike

我的开发模式如下:

  1. 我需要功能
  2. 我创建一个界面
  3. 我创建了一个实现该接口(interface)的空类
  4. 我通过 TDD(使用 Mockito)构建实现,按照第 1 步到第 3 步实现它所依赖的功能

这会导致大量接口(interface)具有单一的实现类。是否存在捷径,更好的方法?


更新

根据评论我发现 Mockito 可以用来模拟类(不要笑我)。我做了一个小实验。这是 UML:

UML

这是相关代码(所有类,没有接口(interface)):

public class MessageGetter {

public String getMessage() {
return "Real Hello";
}

}

public class MessageDisplayer {

public void displayMessage(String message) {
System.out.println(message);
}

}

public class MessageWriter {

private MessageGetter messageGetter;
private MessageDisplayer messageDisplayer;

public void setMessageGetter(MessageGetter messageGetter) {
this.messageGetter = messageGetter;
}

public void setMessageDisplayer(MessageDisplayer messageDisplayer) {
this.messageDisplayer = messageDisplayer;
}

public void writeMessage() {
String message = messageGetter.getMessage();
messageDisplayer.displayMessage(message);
}

}

因此,使用 Mockito,我能够在没有单一接口(interface)的情况下测试 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 Framework 中创建接口(interface)已经很长时间了,以至于我不知道不这样做是否可以。可以停下来吗?

最佳答案

嗯,看起来使用 Spring 和 Mockito 生活可以更简单。我进一步简化了我在问题中发布的代码。基本思想是:

  1. 我们不需要 setter 方法
  2. 我们可以在单元测试中自动创建模拟
  3. 我们可以在单元测试中自动注入(inject)模拟
  4. 不需要接口(interface)

以下是此示例的 pom.xml 中的依赖项:

<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>

这是两个组件:

@Component
public class MessageDisplayer {

public void displayMessage(String message) {
System.out.println(message);
}

}

@Component
public class MessageGetter {

public String getMessage() {
return "Real Hello";
}

}

这是我正在测试的类:

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);
}

}

关于java - 有没有办法避免在 Spring 框架中创建大量接口(interface)和类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35967136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com