java - Spring、Feign 和 TestNG 的策略

标签 java spring testng netflix-feign spring-cloud-feign

我目前有一个项目使用 TestNG 对我的 Spring 项目执行测试。在我的项目中,我有一组 Feign 接口(interface)来处理对我的 Eureka 配置的外部调用。我很难理解如何在执行期间逐个测试地模拟/拦截这些调用。

这是我的一个 Feign 接口(interface)的示例:

@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 客户端检索到有效结果。

为此目的,您实际上并没有注入(inject)假客户端,而是模拟它。

简而言之,这可以通过两个步骤实现:使用 @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 spring 使用这种方式来测试组件。我描述了a more advanced setup with oauth2 intercepting以及两种测试 oauth2 拦截假客户端的方法。

关于java - Spring、Feign 和 TestNG 的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42306453/

相关文章:

java - 在Java中为具有循环引用的对象实现equals和hashCode

java - SSO 身份验证接触点有何用途?

Spring Security 与 Angular2

java - 如何使用 testng 和 selenium 参数化我的搜索测试

java - android 文本解析的最佳方法

java - Pig 用户定义函数中的 aws Amazon S3 客户端凭证

java - 如何使用 API.ai 修复 Android 应用程序上的 RecognitionEngine 错误

java - 使用 StepVerifier 验证是否至少已经过了一段时间?

java - 尽管通过 @Test(testName = "sth") 设置测试名称,ITestResult getTestName() 返回 null

java - 如何使用 TestNG 在循环中运行 @beforeclass @test 和 @Afterclass 案例