简体   繁体   中英

Spock Spring inject mock and bean via constructor

I'm looking for way how to inject beans and mock in single constructor.

@Service
public class SomeService {

private EndpointUrlProvider endpointUrlProvider;
private RestTemplate restTemplate;

@Autowired
public SomeService(EndpointUrlProvider endpointUrlProvider, RestTemplate restTemplate){
  this.endpointUrlProvider = endpointUrlProvider;
  this.restTemplate = restTemplate;
}

Test:

class SomeTest extends Specification {

@Autowired
EndpointUrlProvider endpointUrlProvider

RestTemplate restTemplate = Mock {
    postForEntity(_, _, SomeResponse.class) >> new ResponseEntity(new SomeResponse(), HttpStatus.OK)
 }

SomeService someService = new SomeService(endpointUrlProvider, restTemplate)

//some tests
    }

When I fire test my endpointUrlProvider in someService is null. What I did wrong ? What is the best way to test this?

As far as I see, you are trying to do partial mocking. To inject Spring beans, first you will need TestContextManager . Therefore, run the test with SpringRunner or SpringJUnit4ClassRunner . This should do the work:

@RunWith(SpringRunner.class)
public class SomeServiceTest {

    @Autowired
    private EndpointUrlProvider endpointUrlProvider;

    @Before
    public setUp() {
        RestTemplate restTemplate = mock(RestTemplate.class);
        SomeService someService = new SomeService(endpointUrlProvider, restTemplate);
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM