单元测试怎么注入service
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单元测试怎么注入service相关的知识,希望对你有一定的参考价值。
你代替容器new对象就行了,如果用的spring管理service对象的,用代码加载spring的xml,文件,再用getBean获取service对象,再测试就行了,你这样service没有注入肯定报空了。 参考技术A 用spring的FilterChainProxy,把拦截到的request转发给你的bean就行了。或者在调用这个方法之前使用一个拦截器,亦称spring方法拦截器。在这个拦截器中的继承方法中统计即可。如何对`viewDidLoad()`进行单元测试
在iOS上进行单元测试UIViewController.viewDidLoad()
方法时,每个人最喜欢注入依赖关系的方式是什么?
鉴于我的实施是:
class MyViewController: UIViewController {
var service: Service = Service()
override func viewDidLoad() {
super.viewDidLoad()
service.load()
}
}
我的测试类就是这样的:
class MyViewController Tests: XCTestCase {
var vc: MyViewController!
var serviceMock = ServiceMock()
override func setUp() {
super.setUp()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
vc = storyboard.instantiateViewController(withIdentifier: "MyViewController") as! MyViewController
vc.service = serviceMock
}
}
func testThatServiceIsCalled() {
XCTAssertTrue(serviceMock.loadCalled)
}
这里显而易见的问题是,当我实例化viewController时调用viewDidLoad()
,并且测试失败,因为模拟没有正确注入。
有解决方案吗
答案
为什么需要使用故事板来创建视图控制器?
这不行吗?
func testThatServiceIsCalled() {
let vc = MyViewController()
vc.service = serviceMock
vc.viewDidLoad()
XCTAssertTrue(serviceMock.loadCalled)
}
另一答案
TL; DR您不应该像这样单元测试与UI相关的方法。
控制器和视图不适合单元测试,原因很简单,因为它们通常涉及在屏幕上反映的操作,因此(非常)难以测试。快照测试或UI自动化测试是MVC这两个组件的更好选择。
编写良好的Controller不包含业务逻辑,它将UI内容委托给View,并将业务操作委托给其Model。考虑到这一点,它应该是可以进行单元测试的模型。
现在,如果你真的想断言你的服务是用正确的方法调用的,你可以将VC设置为root视图控制器,这应该确保loadView
方法获得调用者,这应该触发viewDidLoad
:
func testThatServiceIsCalled() {
let window = UIWindow(frame: UIScreen.main.bounds)
window.makeKeyAndVisible()
window.rootViewController = vc
XCTAssertTrue(serviceMock.loadCalled)
}
以上是关于单元测试怎么注入service的主要内容,如果未能解决你的问题,请参考以下文章
Springboot单元测试调用Service或Dao方法出现空指针异常
Springboot单元测试调用Service或Dao方法出现空指针异常
SpringBug记录 -- java.lang.NullPointerException在Spring单元测试中遇到的空指针异常及依赖注入异常总结