首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何测试使用查找的NetBeans平台代码?

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

Stack Overflow用户
提问于 2015-10-21 14:20:05
回答 2查看 492关注 0票数 4

如何为使用静态方法查找依赖关系的平台代码编写单元测试?

在NetBeans平台应用程序中,我遇到了如下代码:

代码语言:javascript
复制
MyService service = Lookup.getDefault().lookup(MyService.class);
service.doStuff(....);

对我来说,静态访问似乎是一种反模式,很难测试。当我搜索周围时,我只看到关于低耦合和高内聚、远程接口等的评论。

许多人似乎喜欢我觉得这是个好主意,但我想知道如何才能为这样的代码编写一个合理的单元测试,而不用在我的单元测试中使用模拟静态方法或使用查找功能。

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

代码语言:javascript
复制
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.getDefault()。Netbeans平台没有提供常规的依赖注入机制,所以如果我像这样引入它,它就像逆流而上。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-30 11:57:03

到目前为止,我找到了几种解决这个问题的方法。

1-在具有较高职位的Lookup中发布类的测试版本

代码语言:javascript
复制
@org.openide.util.lookup.ServiceProvider(service = MyService.class, position = 1)
public class TestService implements MyService {
    public void doStuff(....) {

2-使用NBJunit的MockService

代码语言:javascript
复制
public class MyTest extends NbTestCase {
    public void setUp() throws Exception {     
        org.netbeans.junit.MockServices.setServices(TestService.class);
    }

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

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2017-01-16 13:59:31

类TestService必须在测试类中可见(通常,我们使用查找来松散依赖,这就是为什么接口和实现在单独的模块中)。

考虑在测试模块的独立性中添加TestService模块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33261856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档