这是测试类的设置:
@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的类。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
这只是一个疯狂的猜测,您是否尝试使用常规Mockito而不是BDDMockito?只是想把它排除在罪魁祸首之外。