I have a test class that loads the test context of a spring application, now I want to create a junit rule that will set some test data in mongo db. To do this, I created a rule class.
public class MongoRule<T> extends ExternalResource { private MongoOperations mongoOperations; private final String collectionName; private final String file; public MongoRule(MongoOperations mongoOperations, String file, String collectionName) { this.mongoOperations = mongoOperations; this.file = file; this.collectionName = collectionName; } @Override protected void before() throws Throwable { String entitiesStr = FileUtils.getFileAsString(file); List<T> entities = new ObjectMapper().readValue(entitiesStr, new TypeReference<List<T>>() { }); entities.forEach((t) -> { mongoOperations.save(t, collectionName); }); } }
Now I use this rule inside my test class and pass the mongoOperations bean.
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringTestConfiguration.class) public class TransactionResourceTest { @Autowired private ITransactionResource transactionResource; @Autowired private MongoOperations mongoOperations; @Rule public MongoRule<PaymentInstrument> paymentInstrumentMongoRule = new MongoRule(mongoOperations, "paymentInstrument.js", "paymentInstrument"); .... }
The problem is that Rule is started before the application context is loaded, so the mongoOperations reference is passed as null. Is there a way to make the rules run after the context loads?
source share