5

我现在拥有的

我有一个 3rd 方单例实例,我的测试类依赖于该实例,并且该单例正在System.getenv(String)其构造函数中使用。可以模拟这个电话吗?

我试过这个

JMockIt 示例

    new Expectations()
    {

        System mockedSystem;
        {
            System.getenv( "FISSK_CONFIG_HOME" ); returns( "." );
        }
    };

但它给了我一个EXCEPTION_ACCESS_VIOLATION并使JVM崩溃。

是否有另一种方法可以为单元测试设置系统环境变量?

4

5 回答 5

15

在这种情况下,您需要使用部分模拟,以便 JMockit 不会重新定义 System 类中的所有内容。以下测试将通过:

   @Test
   public void mockSystemGetenvMethod()
   {
      new Expectations()
      {
         @Mocked("getenv") System mockedSystem;

         {
            System.getenv("envVar"); returns(".");
         }
      };

      assertEquals(".", System.getenv("envVar"));
   }

我将很快实现一个增强功能,这样在模拟 JRE 类时就不会出现这样的问题。它应该在版本 0.992 或 0.993 中可用。

于 2009-10-30T15:19:18.587 回答
3

PowerMock接缝能够模拟系统类。

您的另一个选择(假设您没有对 3rd 方 API 进行单元测试)是为Facade创建一个 具有良好、易于模拟的接口的第 3 方 API,并让您的测试类使用它而不是真实的东西。

哦,JMockIt 也支持这个:package playtest;

import static org.junit.Assert.*;

import mockit.*;
import mockit.integration.junit4.JMockit;

import org.junit.*;
import org.junit.runner.RunWith;

@RunWith(JMockit.class)
public class JMockItTest {

 @Test
 public void mockSystemGetEnv() {
  Mockit.setUpMocks(MockSystem.class); 

  assertEquals("Bye", System.getenv("Hello"));

 }

 @MockClass(realClass = System.class)
 public static class MockSystem {
  @Mock
  public static String getenv(String str) {
   return "Bye";
  }
 }

}
于 2009-10-27T10:49:46.660 回答
2

您无法更改环境,但可以更改对它的访问:只需将调用包装System.getenv()在方法或帮助器类中,然后对其进行模拟。

[编辑] 现在您的问题是如何更改第三方库的代码。这里的解决方案是使用 Java 反编译器并修复类。如果需要,您也可以发送功能请求。将该新类添加到您的测试套件中。这应该使您的 IDE 找到测试的类。

由于测试代码不会投入生产,您可以运行测试,生产代码将使用原始库。

于 2009-10-27T10:22:53.023 回答
1

不久前,我想测试 System.exit,并通过使用自定义 SecurityManager找到了解决方案。您可以验证正在进行调用,以及调用的参数,但使用此方法,您无法模拟调用的返回值。

于 2009-10-27T10:46:50.760 回答
0

@Rogério 答案的更新。

在我使用 JMockit 1.25 的情况下,我必须使用 MockUp API:

@Test
public void mockSystemGetenvMethod(){
    new MockUp<System>()
    {
        @Mock
        public String getenv(final String string) {
            return "";
        }
    };

    assertEquals(".", System.getenv("envVar"));
}
于 2016-08-12T10:45:50.213 回答