Spring、Feign 和 TestNG 的策略
Strategy for Spring, Feign and TestNG
我目前有一个项目使用 TestNG 对我的 Spring 项目执行测试。在我的项目中,我有一组 Feign 接口来处理对我的 Eureka 配置的外部调用。我很难理解如何在执行期间逐个测试地 mock/intercept 这些调用。
这是我的 Feign 接口之一的示例:
@FeignClient ("http://my-service")
public interface MyServiceFeign {
@RequestMapping (value = "/endpoint/{key}", method = RequestMethod.GET)
SomePojo getByKey(@PathVariable ("key") String key);
}
我有一个依赖客户端的服务:
@Service
public class MyService {
@Autowired
private MyServiceFeign theFeign;
public SomePojo doStuff() {
return theFeign.getByKey("SomeKey");
}
}
我的测试只需通过以下方式启动:
@SpringBootTest (
classes = Service.class,
webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT
)
@TestExecutionListeners (
inheritListeners = false,
listeners = {
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class
}
)
@DirtiesContext
@ContextConfiguration (initializers = CustomYamlLoader.class)
@ActiveProfiles ("test")
publi class MyModuleTest extends AbstractTestNGSpringContextTests {
// ....
}
我想要在我的测试中做的是执行这样的事情:
@Test
public void doSomeTest() {
SomePojo fakeReturn = new SomePojo();
fakeReturn.setSomeStuff("some stuff");
/*
!!! do something with the injected feign for this test !!!
setupFeignReturn(feignIntercept, fakeReturn);
*/
SomePojo somePojo = injectedService.doStuff();
Assert.assertNotNull(somePojo, "How did I get NULL in a fake test?");
}
所以,这是我的困境:我想我缺少能够做到这一点的关键理解。那或者我完全错过了应该如何处理的概念。我认为在这里使用回退实现没有意义,但我可能是错的。
求助!
据我了解,您正在处理伪造的客户端(可能还有安全性最高的客户端,例如基本身份验证或 OAuth2),并且想要进行测试。但实际上,attend 并不是为了测试 MyServiceFeign
是否工作,而是 MyService
是否正常工作,给定 feign client 检索到有效结果。
为了这个目的,你实际上并没有注入你的假客户端,你 mock 它。
简而言之,这可以通过两个步骤实现:使用 @MockBean
而不是 @Autowired
,并在使用前描述您的客户行为。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = YourApp.class)
public class MyServiceUnitTest {
@MockBean
private MyServiceFeign myFeignClient;
@Autowiered
private MyService myService;
@Test
public void testSync() {
given(myFeignClient.getByKey("SomeKey")).willReturn(
new SomePojo("SomeKey")
);
assertEquals("SomeKey", myService.doStuff().getKey());
}
}
如前所述,Mockito is used by spring for this way of testing components. I describe a more advanced setup with oauth2 intercepting 和两种测试 oauth2 的方法截获了假冒客户端。
我目前有一个项目使用 TestNG 对我的 Spring 项目执行测试。在我的项目中,我有一组 Feign 接口来处理对我的 Eureka 配置的外部调用。我很难理解如何在执行期间逐个测试地 mock/intercept 这些调用。
这是我的 Feign 接口之一的示例:
@FeignClient ("http://my-service")
public interface MyServiceFeign {
@RequestMapping (value = "/endpoint/{key}", method = RequestMethod.GET)
SomePojo getByKey(@PathVariable ("key") String key);
}
我有一个依赖客户端的服务:
@Service
public class MyService {
@Autowired
private MyServiceFeign theFeign;
public SomePojo doStuff() {
return theFeign.getByKey("SomeKey");
}
}
我的测试只需通过以下方式启动:
@SpringBootTest (
classes = Service.class,
webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT
)
@TestExecutionListeners (
inheritListeners = false,
listeners = {
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class
}
)
@DirtiesContext
@ContextConfiguration (initializers = CustomYamlLoader.class)
@ActiveProfiles ("test")
publi class MyModuleTest extends AbstractTestNGSpringContextTests {
// ....
}
我想要在我的测试中做的是执行这样的事情:
@Test
public void doSomeTest() {
SomePojo fakeReturn = new SomePojo();
fakeReturn.setSomeStuff("some stuff");
/*
!!! do something with the injected feign for this test !!!
setupFeignReturn(feignIntercept, fakeReturn);
*/
SomePojo somePojo = injectedService.doStuff();
Assert.assertNotNull(somePojo, "How did I get NULL in a fake test?");
}
所以,这是我的困境:我想我缺少能够做到这一点的关键理解。那或者我完全错过了应该如何处理的概念。我认为在这里使用回退实现没有意义,但我可能是错的。
求助!
据我了解,您正在处理伪造的客户端(可能还有安全性最高的客户端,例如基本身份验证或 OAuth2),并且想要进行测试。但实际上,attend 并不是为了测试 MyServiceFeign
是否工作,而是 MyService
是否正常工作,给定 feign client 检索到有效结果。
为了这个目的,你实际上并没有注入你的假客户端,你 mock 它。
简而言之,这可以通过两个步骤实现:使用 @MockBean
而不是 @Autowired
,并在使用前描述您的客户行为。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = YourApp.class)
public class MyServiceUnitTest {
@MockBean
private MyServiceFeign myFeignClient;
@Autowiered
private MyService myService;
@Test
public void testSync() {
given(myFeignClient.getByKey("SomeKey")).willReturn(
new SomePojo("SomeKey")
);
assertEquals("SomeKey", myService.doStuff().getKey());
}
}
如前所述,Mockito is used by spring for this way of testing components. I describe a more advanced setup with oauth2 intercepting 和两种测试 oauth2 的方法截获了假冒客户端。