java - 如何测试使用查找的 NetBeans 平台代码?

标签 java unit-testing netbeans-platform

TL;DR 如何为使用静态方法查找依赖项的 NetBeans 平台代码编写单元测试?

在 NetBeans 平台应用程序中,我遇到这样的代码:

MyService service = Lookup.getDefault().lookup(MyService.class);
service.doStuff(....);

对我来说,静态访问似乎是一种反模式并且难以测试。当我四处搜索时,我只找到关于低耦合和高内聚、远程接口(interface)等的评论。

很多人好像think this is a Good Idea但我想知道我如何才能为这样的代码编写合理的单元测试,而无需诉诸模拟静态方法或在我的单元测试中使用查找功能。

我想到的第一个想法是将查找重构为常规依赖项:

public class MyClass {

   private Lookup lookup = Lookup.getDefault();

   public void myMethod() {
       MyService service = lookup.lookup(MyService .class);
       service.doStuff(....);
   }

   public void setLookup(Lookup lookup) {
       this.lookup = lookup;
   }

然后使用 setter 提供模拟 Lookup 进行测试。

这会起作用,但仍然会导致测试代码在设置模拟之前调用 Lookup.getDefault()。 Netbeans 平台没有提供常规的依赖注入(inject)机制,所以如果我这样引入它,感觉就像逆流而上。

我觉得我错过了什么。是否有为 Netbeans 平台代码编写单元测试的标准方法?

最佳答案

到目前为止,我找到了几种解决方法。

1 - 在 Lookup 中发布类的测试版本,位置更高

@org.openide.util.lookup.ServiceProvider(service = MyService.class, position = 1)
public class TestService implements MyService {
    public void doStuff(....) {

2 - 使用NBJunit的MockService

public class MyTest extends NbTestCase {
    public void setUp() throws Exception {     
        org.netbeans.junit.MockServices.setServices(TestService.class);
    }

3- 注册您自己的查找实现:

static {
    System.setProperty("org.openide.util.Lookup", TestLookup.class.getName());
}

public class TestLookup extends org.openide.util.lookup.AbstractLookup {
    public TestLookup() {
        this(new org.openide.util.lookup.InstanceContent());
    }

    private TestLookup(org.openide.util.lookup.InstanceContent ic) { 
        super(ic);
        ic.add(new TestService());
    }

其中一些想法是在这里找到的:https://openide.netbeans.org/tutorial/test-patterns.html .

关于java - 如何测试使用查找的 NetBeans 平台代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33261856/

相关文章:

Python 单元测试数据提供程序

java - 缺少 list 标签 OpenIDE-Module

java - Netbeans 8.2 (RCP) 支持的最新 JDK 版本是什么?

java - 无法让 biojava 在 Maven Netbeans 应用程序中工作

java - 如何使用 JasperReports 从 Oracle 中的 blob 列查看图像?

java - 如何强制 MockitoJUnitRunner 在没有基本 http 身份验证的情况下失败?

java - Weblogic 没有 [javax.persistence.EntityManager] 类型的唯一 bean

flutter - Dart/Flutter Web 单元测试错误 : Error: Not found: 'dart:html'

java - 如何在可能的情况下使用 API 级别 8 类,否则什么都不做

java - Eclipse Java 上的退出代码