Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有没有办法避免在Spring框架中创建大量接口和类?_Java_Spring_Tdd - Fatal编程技术网

Java 有没有办法避免在Spring框架中创建大量接口和类?

Java 有没有办法避免在Spring框架中创建大量接口和类?,java,spring,tdd,Java,Spring,Tdd,我的发展模式如下: 我需要功能 我创建了一个接口 我创建了一个实现该接口的空类 我通过TDD(使用Mockito)构建实现,遵循步骤1到步骤3实现它所依赖的功能 这将导致使用单个实现类的大量接口。有没有捷径,更好的方法 更新 根据这些评论,我发现Mockito可以用来模拟类(不要嘲笑我)。我做了一个小实验。以下是UML: 以下是相关代码(所有类,无接口): 因此,使用Mockito,我能够在没有单个接口的情况下测试MessageWriter.writeMessage() public cla

我的发展模式如下:

  • 我需要功能
  • 我创建了一个接口
  • 我创建了一个实现该接口的空类
  • 我通过TDD(使用Mockito)构建实现,遵循步骤1到步骤3实现它所依赖的功能
  • 这将导致使用单个实现类的大量接口。有没有捷径,更好的方法


    更新

    根据这些评论,我发现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时生活会更简单。我已经进一步简化了我在问题中发布的代码。其基本思想是:

  • 我们不需要setter方法
  • 我们可以在单元测试中自动创建模拟
  • 我们可以在单元测试中自动注入模拟
  • 不需要接口
  • 以下是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>
    
    下面是我正在测试的类:

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