2013-07-02 29 views
0

简单服务类AnalyzerService调用存储过程在数据库中。 尝试运行集成测试以确保服务调用存储过程并在分析器类对其进行操作后返回正确的数据。但是,获取“无法在空对象上调用方法calculateEstimateNumberOfPositions()”的可怕异常“。为什么服务对象为空?我错过了什么?Grails集成测试无法在空服务对象上调用方法?

谢谢!

package foobar.analyze 
import static org.junit.Assert.* 
import org.junit.* 
import foobar.analyze.AnalyzerService 
//@TestFor(AnalyzerService) 
class AnalyzerServiceTests { 
    def AnalyzerService service 
    def dataSource 

    @Before 
    void setUp() { } 

    @After 
    void tearDown() { } 

    @Test 
    void testcalculateEstimateNumberOfPositions() { 
     String positionName = "crew" 
     String city = "Great Neck" 
     String state = "NY" 
     int numberOfPositionsSought = 100 
     int expectedNumberOfPositionsEstimate = 100 
     def numberOfPositionsEstimate = service.calculateEstimateNumberOfPositions(positionName, city, state, numberOfPositionsSought) 
     fail (numberOfPositionsEstimate != expectedNumberOfPositionsEstimate) 
    } 
} 

回答

1

公约。遵守公约。任何超出常规的术语,都会在依赖注入过程中产生问题。

约定是使用服务类名称analyzerService而不是service进行集成测试。

集成测试应该像

class AnalyzerServiceTests extends GroovyTestCase { 
    //Service class injected only if you 
    //use the naming convention as below for AnalyzerService 
    def analyzerService 
    def dataSource 
    ...... 
    ...... 
} 

这是可能的,当你使用测试混入

@TestFor(AnalyzerService)

通过在单元测试用例使用上述使用service在单元测试用例,您可以在测试用例中使用默认的service变量。这在集成测试的情况下是不一样的。

+0

在这种情况下,你说得对,这个约定很重要,但是一般性的陈述“任何不符合约定都会让你处于狂野状态”太强大了。有很多情况下,如果您想在标准方法不适用于您的情况下遵守惯例,那么很多情况下。只是不在这种情况下:) –

+0

@BurtBeckwith正确地说,谢谢。我明白这一点,因为我正在养育我的10个月大,而我只是通过你的书的一半。 :P我会将它更新为合理的。 – dmahapatro

+0

谢谢!是的,在我们的其他项目中,我们正在单元测试中使用服务。说到10MO,我只是在相同的时间后回来休产假 - 试图围绕Grails重新包装我的头。 – Alexx

相关问题