3

我遇到了测试类的问题,该类在构造函数中实现了与 EJB 的一些本地连接。此连接仅在构造函数内部使用,并设置实例化类的一些私有属性。

我要测试的 MyClass:

public class MyClass {

  private String myValue;

  public MyClass() throws Exception {
    MyBeanLocal local = EJBFactory.getLocal(MyBeanLocal.class);
    myValue = local.fetchValue();
  }

  public void processValue() {
    ... do some String magic which should be tested ...
  }

  public String getValue() {
    return myValue;
  }

}

EJBFactory 包含一些增强的查找(带有缓存)并且可以返回本地或远程连接(远程需要服务器位置)。

MyBeanLocal 接口

public interface MyLocalBean {
  public String fetchValue();
}

最后是我想要测试 MyClass.processValue 方法的 junit 类:

public class MyClassTest {

  private MyClass myClass;

  @Before
  public void setUp() {
    myClass = new MyClass();
  }

  @Test
  public void testProcessValue() {
    Assert.assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
  }

}

问题是当我在本地机器(或像 Hudson 或 Jenkins 之类的自动测试机器)上运行 JUnit 并且 bean 在与我的本地不同的应用程序服务器上下文上运行时如何测试情况。我无法接触生产代码,只需要编写测试。

实际上我不需要使 MyBeanLocal 功能,但我需要 myValue 集。

我正在考虑嘲笑,但我不熟悉。

4

2 回答 2

1

您可以使用 JMockit 模拟 API(我创建的)进行此类测试:

public class MyClassTest
{
    @Tested MyClass myClass;

    @Test
    public void processValue() {
        new NonStrictExpectations() {
            @Mocked EJBFactory fac;
            @Mocked MyBeanLocal mb;

            {
                EJBFactory.getLocal(MyBeanLocal.class); result = mb;
                mb.fetchValue(); result = "SOME VALUE";
            }
        };

        assertEquals(myClass.processValue(), "MY EXPECTED VALUE");
    }
}

EJBFactory如果它在单元测试环境中仍然返回一个对象,甚至可以省略模拟。

于 2013-05-29T14:05:05.057 回答
0

在测试涉及数据库连接的类时,模拟通常是最好的方法。有几个框架可以让模拟对象变得更容易,其中之一是Mockito

您可以在此处找到有关它的更多信息

Martin Fowler 还写了一篇很好的文章,介绍了何时使用模拟以及模拟和存根之间的区别。这是文章的链接

于 2013-05-21T06:51:35.577 回答