2012-11-02 2 views
0

Я пытаюсь загрузить переменные напрямую на основе среды, в которой работает код. Я написал код и столкнулся с проблемами. Не могли бы вы указать мне, что я делаю неправильно.Проблема с профилем

WebAppInitializer.java

public class WebAppInitializer implements WebApplicationInitializer { 
@Override 
public void onStartup(ServletContext sc) throws ServletException { 
// Create the 'root' Spring application context 
AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); 
root.scan("com.configs"); 
root.getEnvironment().setActiveProfiles("dev"); 
root.refresh(); 


// Manages the lifecycle of the root application context 
sc.addListener(new ContextLoaderListener(root)); 

// Handles requests into the application 
ServletRegistration.Dynamic appServlet = sc.addServlet("appServlet", 
           new DispatcherServlet(new GenericWebApplicationContext())); 
appServlet.setLoadOnStartup(1); 
Set<String> mappingConflicts = appServlet.addMapping("/"); 

if (!mappingConflicts.isEmpty()) { 
    throw new IllegalStateException(
        "'appServlet' could not be mapped to '/' due " 
        + "to an existing mapping. This is a known issue under Tomcat versions " 
        + "<= 7.0.14; see https://issues.apache.org/bugzilla/show_bug.cgi?id=51278"); 
} 

} 

}

DynamicConfig.java

@Configuration 
@Profile("dev") 
@PropertySource("classpath:/devel.properties") 

public class DynamicConfig { 

@Autowired 
Environment env; 

@Bean 
public TestClass testClass(){ 
    TestClass testClass = new TestClass(); 
    testClass.setEnvironment(env.getProperty("environment")); 
    return testClass;  
} 

}

TestClass является простой класс с одной переменной экземпляра, который будет поступать из конфигурации на основе среды ,

TestCase: package com.tester;

import org.junit.Test; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 

import com.configs.DynamicConfig; 
    import com.configs.EnvironmentDetector; 
import com.tester.TestClass; 

public class TestClassTest { 
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DynamicConfig.class); 

@Test 
public void test(){ 
    ApplicationContext context = new AnnotationConfigApplicationContext(DynamicConfig.class); 
    context.getEnvironment().setActiveProfiles("dev"); 
    context.scan("com.configs"); 
    TestClass test = context.getBean(TestClass.class); 
    System.out.println(test.getEnvironment()); 
} 

}

Теперь я получаю ниже ошибки

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.282 sec <<< FAILURE! 
    test(com.tester.TestClassTest) Time elapsed: 0.279 sec <<< ERROR! 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.tester.TestClass] is defined: expected single bean but found 0: 
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:280) 
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1106) 
at com.tester.TestClassTest.test(TestClassTest.java:16) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35) 
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:146) 
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103) 
at $Proxy0.invoke(Unknown Source) 
at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:145) 
at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:87) 
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69) 

Когда я удалить строку @profile ("Dev") из кода DynamicConfig.java работает нормально. Но я хочу этого. Я хочу создать похожие классы для prod.

Пожалуйста, помогите

Благодаря

ответ

2

Обновить тестовый класс, чтобы активировать профиль. В настоящее время вы активируете его, добавив свойство в WebApplicationInitializer, которое не запускается в контексте вашего теста.

Один из способов активации он будет делать следующее, однако это не единственный способ:

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles({"dev"}) 
@ContextConfiguration(classes = {DynamicConfig.class}) 
public class TestClassTest { 

@Autowired 
TestClass testClass; 

@Test 
public void test(){ 
     System.out.println(testClass.getEnvironment()); 
} 
+0

Привет ... ваш подход работал спасибо много. Можете ли вы исправить мне другой подход ... Я обновил тестовый файл ... Обновленная testCase не работает даже после активации профиля. Я пытаюсь следовать этой ссылке: http://blog.springsource.com/2011/02/14/spring-3-1-m1-introducing-profile/ – javaMan

Смежные вопросы