静态方法的PowerMockito.mockStatic()在Spring Boot Test中无法正常工作

时间:2017-12-06 22:06:03

标签: java unit-testing spring-boot

这是测试类的设置:

@RunWith(PowerMockRunner.class)
@PowerMockIgnore("javax.management.*")
@PowerMockRunnerDelegate(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = ServiceApplication.class)
@PrepareForTest({ MyClass.class })
public class ControllerTest {

    @Autowired
    public TestRestTemplate restTemplate;

    public static MyClass myClass = Mockito.mock(MyClass.class);

    @BeforeClass
    public static void beforeClassSetup() throws Exception {
        PowerMockito.mockStatic(MyClass.class);
        BDDMockito.given(MyClass.getInstance(Mockito.anyString())).willReturn(myClass);
        BDDMockito.given(myClass.foo()).willReturn("BAR");
        // ...
    }
 .
 .
 .
 // test cases

在这个项目的配置类中,为了加载一些bean,我使用这个静态调用来生成实例。

@Configuration
@ComponentScan(basePackages = { "package.from.another.project.in.production" })
public class Beans {

    @Bean
    public MyClass myClass() {
        return MyClass.getInstance(K.FOO);
    }

}

这是我的控制器,它使用bean,以及根据参数的静态调用。

@RestController
public class Controller {

    @Autowired
    private MyClass myClass;

    @GetMapping(path = "/")
    public String doSomething() {
            String filter = myClass.foo();
            return filter;
    }

    @GetMapping(path = "/two")
    public String doSomething2(@RequestParam Map<String, String> allParams) {
            String accountId = allParams.get("account_id");
            String filter = MyClass.getInstance(K.BAR + accountId).foo();
            return filter;
    }
}

bean是自动装配的,因为它的使用大于getInstance()方法的实例化。另外,getIntance()方法的实例化根据参数是可变的。不要问我为什么MyClass类是这样的,因为API已经过时了,而且我正在慢慢重构。

问题是自动装配的bean被PowerMockito.mockStatic(MyClass.class)以及@MockBean(我最初使用过)正确模拟过,但MyClass.getInstance()中的调用Controller.class没有工作。

我认为问题应该发生在Spring爬上它的环境并且不加载PowerMockito正确模拟的所有东西,只是它的bean的类。任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这只是一个疯狂的猜测,您是否尝试使用常规Mockito而不是BDDMockito?只是想把它排除在罪魁祸首之外。