@RefreshScope - тестовые примеры JUnit - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь протестировать мой контроллер, используя тестовые примеры JUNIT, но нахожу следующее исключение

Caused by: java.lang.IllegalStateException: No Scope registered for scope name 'refresh'
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.getTarget(CglibAopProxy.java:705)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at com.pepsico.eip.dao.DAOFactory$$EnhancerBySpringCGLIB$$d1aa4340.getCustomerDAOByDataSource(<generated>)
at com.pepsico.eip.controllers.CustomerController.create(CustomerController.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 80 more

Мой метод TestCase:

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@ContextConfiguration(classes= {CustomerDataServiceApplication.class})
@WebMvcTest(CustomerController.class)
@RunWith(SpringRunner.class)
public class CustomerControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void testCreateCustomer()
{
    String customer="{\"CustID\":4," + 
            "\"CustName\":\"Raj\"}";

    try {
        this.mockMvc.perform(post("add/customer").header("Authorization", "Basic FNMVMyQ0VEZWlwOkVJUC" ).
                content(customer).
                contentType(MediaType.APPLICATION_JSON_UTF8))
                .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8));

        } catch (Exception e) {
        // TODO Auto-generated catch block
        System.out.println("error in test class-testCreateCustomerEntry: "+e.getMessage());
        e.printStackTrace();
        }
    }

У меня есть это требование, чтобы брать переменные изОблачный сервер конфигурации и использование @RefreshScope следующим образом

@RefreshScope
@Component
public @Data class ConfigProperty {

    @Value("${dataSource}")
    public String dataSource;

    public String getDataSource() {
    return dataSource;
   }
}

Другой класс, где я возьму значение из вышеуказанного класса

@RefreshScope
@Component("baseFactory")
public class DAOFactory implements BaseFactory {

@Autowired
private Environment config;

@Autowired
ConfigProperty configProperty;


private static final Logger LOGGER = LoggerFactory.getLogger(DAOFactory.class);

@Autowired
@Qualifier("hazelcastCustomerImpl")
CustomerDAO hazelcastCustomerImpl;

@Autowired
@Qualifier("cassandraCustomerImpl")
CustomerDAO cassandraCustomerImpl;  

public CustomerDAO getCustomerDAOByDataSource() {
    LOGGER.info("DataSource: " + configProperty.getDataSource());
    switch (configProperty.getDataSource().toUpperCase()
            ) 
            {
    case "CASSANDRA": {
        return cassandraCustomerDAOImpl;
    }
    case "HAZELCAST": {
        return hazelcastCustomerDAOImpl;
    }

    default: {
        return cassandraCustomerDAOImpl;
    }
    }
}

}

Просим вас помочьмне, чтобы решить это, спасибо

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Я столкнулся с той же проблемой, когда использовал @WebMvcTest (для тестового примера) и @RefreshScope (для конфигурации)

Решение: используйте

@SpringBootTest

вместо

@WebMvcTest

Причина: для работы RefreshScope необходим полный контейнер, а когда мы используем WebMvcTest, он не использует весь контейнер.WebMvcTest не загружает все конфигурации для весны.Возможно, из-за этого RefreshScope не был загружен.

0 голосов
/ 10 декабря 2018

попробуйте добавить в свой тестовый файл:

@ImportAutoConfiguration(RefreshAutoConfiguration.class)
...