2016-11-18 46 views
1

我现在面临的问题,让每方法老虎钳System.getProperty("name")值嘲讽System.class 实例后:模拟System.class在JUnit

@Test 
public void Test1()throws Exception { 
    PowerMockito.mockStatic(System.class); 
    // Configuration 
    when(System.getProperty("os.name")).thenReturn("Win"); 
} 
@Test 
public void Test2() throws Exception { 
    PowerMockito.mockStatic(System.class); 
    when(System.getProperty("os.name")).thenReturn("Linux"); 
} 

我们有两个测试方法,当我们运行上面提到的两个方法独立,那么我们得到正确的值System.getProperty("os.name")。但是当我们正在运行类(将在类中执行这两种方法),那么我们在第二种方法中获得第一个方法的System.getProperty("os.name")值。 请建议。

提前致谢。

+1

你可以添加整个班级代码吗? – developer

+0

我无法复制,请提供整个测试类 –

+1

如果您想测试系统属性,您应该将'System'套装在桥中。想想像[系统规则](http://stefanbirkner.github.io/system-rules/)。 –

回答

0

如果你想改变系统属性,为什么不只是System.setProperty("os.name", "")?这工作:

public class SystemPropertyTest { 

    @Test 
    public void testWin() { 
     System.setProperty("os.name", "Win"); 

     Assert.assertEquals("Win", System.getProperty("os.name")); 
    } 


    @Test 
    public void testLinux() { 
     System.setProperty("os.name", "Linux"); 

     Assert.assertEquals("Linux", System.getProperty("os.name")); 
    } 
} 
+0

修改系统属性必须非常谨慎或避免,因为它会影响你的env,因此它可能会影响其他测试。更糟糕的是,您需要在测试结束时重新设置旧值。 –

+0

正确,我将修改答案以包含系统属性的恢复。但这基本上是PowerMock所做的,对吧?模拟静态方法将产生全球影响。这是目的。 –

+0

关键是OP不需要静态嘲弄来达到目标​​。 –

2

我会使用额外的外部库,类似于System Rules

然后,您可以通过以下步骤实现你的目标:

public class SystemRulesTest { 

    @Rule 
    public final RestoreSystemProperties restoreSystemProperties = new RestoreSystemProperties(); 

    @Test 
    public void test1() { 
    System.setProperty("os.name", "Win"); 
    } 

    @Test 
    public void test2() { 
    System.setProperty("os.name", "Linux"); 
    } 
} 

注:系统规则,需要JUnit 4.9或以上的工作。