当前位置: 首页 > 知识库问答 >
问题:

在使用Mockito进行测试时,使用实现而不是接口是一个好的实践吗?

葛雪松
2023-03-14

Mockito注释@spy@injectmocks不能用于接口:

public interface MyService() {}

public class MyServiceImpl implements MyService {}


@RunWith(MockitoJUnitRunner.class)
public class MyServiceTest {

    @Spy
    @InjectMocks
    private MyService myService; // won't work

    @Mock
    MyDao myDao;

    // tests
}
    @InjectMocks
    private MyService myService = new MyServiceImpl(); // Program against Interface

解决方案2:

    @Spy
    @InjectMocks
    private MyServiceImpl myService; // Program against implementation

我的问题是,使用解决方案2并让Mockito处理实例化(但这意味着声明一个实现而不是一个接口),还是使用带有接口的解决方案1并自己声明一个实现,这是一个好主意。

共有1个答案

黄元章
2023-03-14

谢谢所有的回复伙计们。帮了我大忙。我现在结束这个问题。

基本上,我应该对实现进行测试。我还想提到这个问题,它包含一些更有用的信息。

 类似资料:
  • 我的配置是:Wildfly8.2.0,Weld 是否可以在CDI中注入bean而不是在其接口中注入?

  • 如何区分模拟不同的impl类,从而调用impl类的方法。我应该像下面这样做吗。 对我没有用。任何一个都抛出空指针异常。请指教。

  • 我使用JUnit4和Mockito创建了一个Spring Boot2应用程序。当我测试某种方法时。会出现这样的例外: 这是我的测试代码 SuveryService.java SurveyRepository.java 我引用了这篇文章Mockito NullPointerException,但这个问题仍然存在。任何帮助都将被应用。

  • # 11.5 测试一个值是否实现了某个接口 这是 11.3 类型断言中的一个特例:假定 v 是一个值,然后我们想测试它是否实现了 Stringer 接口,可以这样做: type Stringer interface { String() string } if sv, ok := v.(Stringer); ok { fmt.Printf("v implements Strin

  • 所以基本上我有一个公共的静态空main方法,它创建一个框架和一个级别,级别是一个面板,然后添加到jframe中,但在代码之后似乎不会检查我在main中的time循环,我知道它没有,因为只要框架是可见的,我的time循环就应该被检查,如果它到达这一点而它没有,它应该在控制台窗口中打印一行。任何帮助都将不胜感激!同样是的,我知道打印行会弹出一个控制台窗口窗口,而不是实际上把它放在框架中,我为此而声明了

  • 问题内容: 这可能以前曾被问过,但是快速搜索只提出了询问C#的相同问题。看这里。 我基本上想做的是检查给定对象是否实现了给定接口。 我有点想出了一个解决方案,但这不足以在if或case语句中频繁使用它,我想知道Java是否没有内置解决方案。 编辑:好的,谢谢您的回答。特别是对于Damien Pollet和Noldorin,您让我重新考虑了设计,因此我不再测试接口。 问题答案: 该运营商确实在工作安