假设我们对类中的各个字段使用@Autowired注释,并且我们没有编写也可以设置字段的setter或构造函数。
问题-访问修饰符应该是什么,private还是package-private (即无)?
例如:
public class MyClass {
@Autowired
private MyService myService;
}vs
public class MyClass {
@Autowired
MyService myService;
}在第一种情况下(private字段),Spring使用反射连接字段,即使它没有setter。
第二种情况(package-private字段)允许我们访问这些字段(例如,设置模拟),如果我们需要扩展类以进行测试的话。
因此,这两种情况都很好,但哪种情况更值得推荐,特别是在测试方面?
发布于 2013-10-30 12:41:43
第一种情况还允许您根据框架注入模拟。例如,使用Mockito的@InjectMocks注释。春季测试也有ReflectionTestUtils.setField,.
就我个人而言,我不太喜欢为测试目的修改类,所以我会选择第一种情况。但最终,这主要取决于您喜欢的测试框架。
发布于 2013-10-30 12:44:49
因此,这两种情况都很好,但哪种情况更值得推荐,特别是在测试方面?
我认为属性应该是private
@Autowired
private MyService myService;因为拥有getter方法来提供对属性的访问总是好的,而不是允许其他类直接访问它们。
为了测试目的,注入mocks of private properties将与package-private属性的工作方式相同。
例如,使用Mockito,您可以将private MyService的模拟注入MyClass,如下所示:
public class MyClassTest {
@Mock
MyService service;
@InjectMocks
MyClass serv = new MyClass();
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
}发布于 2013-10-30 12:43:08
我通常更喜欢使用字段私有和使用setter注入:
public class MyClass {
private MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
} 允许该服务为@Autowired,但设置为一个模拟实例进行单元测试。
https://stackoverflow.com/questions/19682293
复制相似问题