Spring、Feign和TestNG的策略

3

我目前有一个项目,使用TestNG对我的Spring项目执行测试。在我的项目中,我有一套Feign接口,用于处理我的Eureka配置上的外部调用。在执行过程中,我很难理解如何在逐个测试的基础上模拟/拦截这些调用。

以下是我的一个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?");
}

所以,这是我的困境:我似乎缺少一个关键的理解来做到这一点。或者我完全没有理解如何处理这个概念。我不认为在这里使用备用实现是有意义的,但我可能错了。

求助!


Mockito. 你听说过吗? - Grzegorz Górkiewicz
我想我应该更清楚 - 让我更新一下描述。 - el n00b
我不是一个踩票者。我投了赞成票以保持平衡。我认为你在寻找嘲笑。 - Grzegorz Górkiewicz
1
我决定使用该服务来设置它。在阅读了这篇文章之后,我不再使用模拟:https://dev59.com/2VsW5IYBdhLWcg3w-bH_ -- 我理解他们的意思,并且觉得我应该能够在不使用模拟的情况下拦截调用。 - el n00b
1个回答

1
据我理解,您正在处理Feign客户端(可能还包括基本身份验证或OAuth2等安全性),并希望进行测试。但实际上,目的不是测试MyServiceFeign是否正常工作,而是在给定 Feign客户端检索到有效结果的情况下,测试MyService是否正常工作。
为此,您实际上不需要注入您的Feign客户端,而是要对其进行模拟
简而言之,这可以通过两个步骤实现:使用@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 用于这种组件测试方式。我描述了 一个更高级的OAuth2拦截设置 和测试OAuth2拦截Feign客户端的两种方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接