代码之家  ›  专栏  ›  技术社区  ›  cringe

如何使用JMockIt System.getenv(字符串)?

  •  5
  • cringe  · 技术社区  · 15 年前

    我有一个第三方singleton实例,我的被测类依赖它,singleton正在使用它 System.getenv(String) 在其构造函数中。有可能模仿这个电话吗?

    我试过这个

    JMockIt示例

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

    EXCEPTION_ACCESS_VIOLATION 并使JVM崩溃。

    是否有其他方法为单元测试设置系统环境变量?

    5 回复  |  直到 15 年前
        1
  •  15
  •   Rogério    15 年前

       @Test
       public void mockSystemGetenvMethod()
       {
          new Expectations()
          {
             @Mocked("getenv") System mockedSystem;
    
             {
                System.getenv("envVar"); returns(".");
             }
          };
    
          assertEquals(".", System.getenv("envVar"));
       }
    

    我将很快实现一个增强,这样在模拟JRE类时就不会出现类似的问题。它应在0.992或0.993版中提供。

        2
  •  3
  •   Michael Lloyd Lee mlk    15 年前

    PowerMock 接缝能够模拟系统类。

    您的另一个选择(假设您没有对第三方API进行单元测试)是为 Facade 第三方API有一个很好的、容易模仿的接口,并且让您的测试类使用这个接口,而不是真正的接口。

    哦,JMockIt也支持这一点: 包装试验;

    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";
      }
     }
    
    }
    
        3
  •  2
  •   Aaron Digulla    15 年前

    您不能更改环境,但可以更改对环境的访问:只需将调用包装到 System.getenv()

    因为测试代码不进入生产环境,所以您可以运行测试,生产代码将使用原始库。

        4
  •  1
  •   brianegge    15 年前

    不久前我想 test System.exit ,并通过使用 custom SecurityManager . 您可以验证正在进行的调用以及调用的参数,但是使用此方法,您不能模拟调用的返回值。

        5
  •  0
  •   Alfergon    8 年前

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

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