Java 弹簧靴;junit:使用@ComponentScan时如何模拟CRUD存储库?

Java 弹簧靴;junit:使用@ComponentScan时如何模拟CRUD存储库?,java,spring,unit-testing,junit,Java,Spring,Unit Testing,Junit,我正在尝试junit测试一个spring启动应用程序。对于这个问题,我创建了一个简单的示例来说明我的问题 服务bean: @Service public class DummyService { public String dummyMethod(String str) { return "Dummy(" + str + ")"; } } 实体类: @Entity public class KeyValue { @Id @GeneratedVa

我正在尝试junit测试一个spring启动应用程序。对于这个问题,我创建了一个简单的示例来说明我的问题

服务bean:

@Service
public class DummyService {
    public String dummyMethod(String str) {
        return "Dummy(" + str + ")";
    }
}
实体类:

@Entity
public class KeyValue {

    @Id
    @GeneratedValue
    Long id;

    @Column(nullable = false)
    String key;

    @Column(nullable = false)
    String value;
}
和存储库:

public interface KeyValueRepository extends CrudRepository<KeyValue, Long>
{
}
如果我现在测试它,它工作得非常完美:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyTestConfig.class)
public class UsingMockTest {

    @Autowired
    KeyValueRepository keyValueRepository;

    @Test
    public void respositoryIsMock()
    {
        MockUtil mo = new MockUtil();
        assertTrue(mo.isMock(keyValueRepository));
    }
}
正如预期的那样,这为我提供了一个模拟版本的存储库

然而,事实证明,这种方法不适合更大的应用。我们真正的应用程序包含50多个bean,它们都是自动连接的。所以我想做的是@ComponentScan应用程序,然后,在我的配置中,只覆盖我实际上想要模拟的bean

但是,如果我这样设置测试配置:

@Configuration
@ComponentScan(
        basePackages = {"com.example"}
)
public class MyTestConfig {

    @Bean
    public DummyService thisForThatService() {
        return new DummyService();
    }

    @Bean
    public KeyValueRepository sayingRepository() {
        return Mockito.mock(KeyValueRepository.class);
    }
}
我将得到一个失败的测试,因为存储库不再是模拟对象。当我查看spring引导日志时,我看到以下内容:

2016-05-30 15:36:50.539  INFO 5908 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'dummyService' with a different definition: 
    replacing [Generic bean: class [com.example.DummyService]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\work\dev\testDemo\build\classes\main\com\example\DummyService.class]]
    with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=myTestConfig; factoryMethodName=dummyService; initMethodName=null; destroyMethodName=(inferred); defined in com.example.MyTestConfig]
2016-05-30 15:36:50.658  INFO 5908 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'keyValueRepository' with a different definition:
    replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=myTestConfig; factoryMethodName=keyValueRepository; initMethodName=null; destroyMethodName=(inferred); defined in com.example.MyTestConfig]
    with [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
因此,对于简单的“DummyBean”,扫描的配置被MyTestConfig类中的显式配置覆盖(这正是我想要的),但是对于CRUD存储库,MyTestConfig类中的模拟bean被组件扫描的JPA bean覆盖

为了能够注入@Autowired mock CRUD存储库,我如何避免这种行为


非常感谢您的帮助

也许它有助于将
@RunWith
annontaion类替换为mock runner类…尝试了一下。不起作用。可能它有助于将
@RunWith
annontaion类替换为mock runner类…尝试过了。不起作用。
2016-05-30 15:36:50.539  INFO 5908 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'dummyService' with a different definition: 
    replacing [Generic bean: class [com.example.DummyService]; scope=singleton; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null; defined in file [C:\work\dev\testDemo\build\classes\main\com\example\DummyService.class]]
    with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=myTestConfig; factoryMethodName=dummyService; initMethodName=null; destroyMethodName=(inferred); defined in com.example.MyTestConfig]
2016-05-30 15:36:50.658  INFO 5908 --- [           main] o.s.b.f.s.DefaultListableBeanFactory     : Overriding bean definition for bean 'keyValueRepository' with a different definition:
    replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=myTestConfig; factoryMethodName=keyValueRepository; initMethodName=null; destroyMethodName=(inferred); defined in com.example.MyTestConfig]
    with [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]