8

我有一个 bean,它的业务逻辑从 ApplicationContext 加载某种类型的 bean 以便处理它们。

对于我的 jUnit 测试,我想在我的单元测试类中创建一些虚拟 bean,看看我的被测 bean 是否正确处理它们。但是,我不确定实现这一目标的最佳方法是什么。

如果我只是在我的测试类中声明我的内部类,Spring 不会将它作为其应用程序上下文的一部分。我意识到我可以在我的 jUnit 类中注入我的应用程序上下文,然后使用 appContext.registerPrototype() 添加它,但是,我认为使用注释可能有一种更简洁的方法。

我尝试用@Component 注释内部类,但并不奇怪,它不起作用。

public class PatchEngineTest extends TestBase {
    @Component
    protected class Patch1 extends PatchBaseImpl implements Patch{
        public void applyPatch() throws Exception {
            // does nothing
        }
    }


    @Autowired PatchRepository patchRepository;
    @Autowired Patch1 patch1;

    @Test
    public void test() {
        fail("Not yet implemented");
    }

}

毫不奇怪,我收到以下错误消息:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.ia.patch.PatchEngineTest$Patch1] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

有没有办法做到这一点?

4

2 回答 2

13

你需要让你的内心阶级static;Spring 不能将非static内部类实例化为 bean。如果确实有正当理由需要非,您可以在方法static中手动创建它。@Bean

于 2013-10-18T02:26:16.930 回答
0

我也遇到了这个问题,下面是我的解决方案:

@RunWith(SpringRunner.class)
@SpringBootTest
@ComponentScan
@ImportAutoConfiguration
public class FooTest {

    @Component
    public static class Bar {

    }
}

我用的是弹簧靴2.1.4.RELEASE

于 2019-05-05T15:03:00.067 回答