嘲讽系统有点困难,获取junit中的调用

laximzn5  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(183)

我正在尝试使用junit和mockito(非常新)为Sping Boot 应用程序编写单元测试。基本上,在我的代码中,我已经为清单中的特定URL指定了一个环境变量。yml文件(用于部署),我可以在代码中通过String URL = System.getenv("VARIABLE")访问它。然而,我在单元测试中遇到了很多麻烦,因为URL变量显然没有定义。我尝试了解决方案here,但意识到这只是为了模拟环境变量,如果你从实际的测试本身调用它,而不是如果你依赖于环境变量可以从代码访问。
有没有什么方法可以设置它,这样当测试运行时,我就可以设置可以在代码中访问的环境变量?

2cmtqfgy

2cmtqfgy1#

可以使用PowerMockito来模拟静态方法。这段代码演示了模拟System类和存根getenv()

@RunWith(PowerMockRunner.class)
@PrepareForTest({System.class})
public class Xxx {

    @Test
    public void testThis() throws Exception {
        System.setProperty("test-prop", "test-value");
        PowerMockito.mockStatic(System.class);

        PowerMockito.when(System.getenv(Mockito.eq("name"))).thenReturn("bart");
        // you will need to do this (thenCallRealMethod()) for all the other methods
        PowerMockito.when(System.getProperty(Mockito.any())).thenCallRealMethod();

        Assert.assertEquals("bart", System.getenv("name"));
        Assert.assertEquals("test-value", System.getProperty("test-prop"));
    }
}

我相信这说明了你正在努力实现的目标。也许有一种更优雅的方法可以使用PowerMockito来做到这一点。spy(),我就是记不起来了。
您需要为System中的所有其他方法执行thenCallRealMethod()。直接或间接被你的代码调用的类。

f4t66c6m

f4t66c6m2#

这可以通过https://github.com/webcompere/system-stubs实现
你有几个选择:

EnvironmentVariables environmentVariables = new EnvironmentVariables("VARIABLE", "http://testurl");

// then put the test code inside an execute method
environmentVariables.execute(() -> {
   // inside here, the VARIABLE will contain the test value
});

// out here, the system variables are back to normal

或者可以使用JUnit4或5插件完成:

@ExtendWith(SystemStubsExtension.class)
class SomeTest {

    @SystemStub
    private EnvironmentVariables environment = new EnvironmentVariables("VARIABLE", "http://testurl");

    @Test
    void someTest() {
        // inside the test the variable is set
        // we can also change environment variables:

        environment.set("OTHER", "value");
    }

}

相关问题