ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਿੰਗ ਵਿੱਚ ਨਿਰਭਰਤਾ ਇੰਜੈਕਸ਼ਨ ਚੁਣੌਤੀਆਂ ਨੂੰ ਸਮਝਣਾ
ਸਪਰਿੰਗ ਬੂਟ ਵੈਬ ਐਪਲੀਕੇਸ਼ਨਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਮਜਬੂਤ ਟੂਲ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਅਲੱਗ-ਥਲੱਗ ਟੈਸਟਾਂ ਲਈ ਇੱਕ ਬੇਤਰਤੀਬ ਪੋਰਟ 'ਤੇ ਸਰਵਰ ਨੂੰ ਸਪਿਨ ਕਰਨ ਦੀ ਸਮਰੱਥਾ ਸ਼ਾਮਲ ਹੈ। ਹਾਲਾਂਕਿ, ਏਕੀਕ੍ਰਿਤ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਜਿਵੇਂ @LocalServerPort ਕੰਟਰੋਲਰ ਟੈਸਟਿੰਗ ਲਈ ਅਚਾਨਕ ਰੁਕਾਵਟਾਂ ਪੇਸ਼ ਕਰ ਸਕਦੀਆਂ ਹਨ। ਟੈਸਟ ਕਲਾਸਾਂ ਤੋਂ ਬਾਹਰ ਸਥਾਨਕ ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਆਟੋਵਾਇਰ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਇੱਕ ਆਮ ਸਮੱਸਿਆ ਪੈਦਾ ਹੁੰਦੀ ਹੈ।
API ਟੈਸਟਿੰਗ ਨੂੰ ਸੁਚਾਰੂ ਬਣਾਉਣ ਲਈ ਤੁਹਾਡੇ ਕੰਟਰੋਲਰਾਂ ਲਈ ਇੱਕ ਕਸਟਮ ਰੈਪਰ ਬਣਾਉਣ ਦੀ ਕਲਪਨਾ ਕਰੋ। ਇਹ ਐਬਸਟਰੈਕਸ਼ਨ ਦੁਹਰਾਉਣ ਵਾਲੀਆਂ ਕਾਲਾਂ ਨੂੰ ਸਰਲ ਬਣਾ ਸਕਦਾ ਹੈ, ਪਰ ਇਸਨੂੰ ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਿੰਗ ਈਕੋਸਿਸਟਮ ਨਾਲ ਜੋੜਨਾ ਅਕਸਰ ਨਿਰਭਰਤਾ ਇੰਜੈਕਸ਼ਨ ਗਲਤੀਆਂ ਵੱਲ ਲੈ ਜਾਂਦਾ ਹੈ। ਅਜਿਹੀਆਂ ਸਮੱਸਿਆਵਾਂ ਪੈਦਾ ਹੁੰਦੀਆਂ ਹਨ ਕਿਉਂਕਿ ਬਸੰਤ ਦਾ ਟੈਸਟ ਵਾਤਾਵਰਨ ਹਮੇਸ਼ਾ ਪਲੇਸਹੋਲਡਰਾਂ ਨੂੰ ਹੱਲ ਨਹੀਂ ਕਰਦਾ ਹੈ ${local.server.port} ਗੈਰ-ਟੈਸਟ ਬੀਨਜ਼ ਵਿੱਚ.
ਡਿਵੈਲਪਰ ਅਕਸਰ ਗਲਤੀ ਦਾ ਸਾਹਮਣਾ ਕਰਦੇ ਹਨ: "ਆਟੋਵਾਇਰਡ ਨਿਰਭਰਤਾ ਦਾ ਟੀਕਾ ਲਗਾਉਣਾ ਅਸਫਲ ਰਿਹਾ; ਪਲੇਸਹੋਲਡਰ 'local.server.port' ਨੂੰ ਹੱਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ।" ਇਹ ਖਾਸ ਤੌਰ 'ਤੇ ਨਿਰਾਸ਼ਾਜਨਕ ਹੋ ਸਕਦਾ ਹੈ ਜਦੋਂ ਤੁਸੀਂ ਗੁੰਝਲਦਾਰ ਟੈਸਟ ਸੈੱਟਅੱਪਾਂ ਨਾਲ ਕੰਮ ਕਰ ਰਹੇ ਹੋ ਜਾਂ ਆਪਣੇ ਟੈਸਟ ਕੋਡ ਨੂੰ ਸਾਫ਼ ਅਤੇ ਮਾਡਿਊਲਰ ਰੱਖਣ ਦਾ ਟੀਚਾ ਰੱਖਦੇ ਹੋ। ਇਹ ਸਮਝਣਾ ਕਿ ਅਜਿਹਾ ਕਿਉਂ ਹੁੰਦਾ ਹੈ ਇੱਕ ਹੱਲ ਨੂੰ ਲਾਗੂ ਕਰਨ ਦੀ ਕੁੰਜੀ ਹੈ।
ਇਸ ਲੇਖ ਵਿੱਚ, ਅਸੀਂ ਇਸ ਮੁੱਦੇ ਦੇ ਮੂਲ ਕਾਰਨ ਦੀ ਪੜਚੋਲ ਕਰਾਂਗੇ ਅਤੇ ਇਸ ਨੂੰ ਦੂਰ ਕਰਨ ਲਈ ਇੱਕ ਕਦਮ-ਦਰ-ਕਦਮ ਹੱਲ ਪ੍ਰਦਾਨ ਕਰਾਂਗੇ। ਸੁਝਾਵਾਂ ਅਤੇ ਵਧੀਆ ਅਭਿਆਸਾਂ ਸਮੇਤ ਸੰਬੰਧਿਤ ਦ੍ਰਿਸ਼ਾਂ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ, ਅਸੀਂ ਯਕੀਨੀ ਬਣਾਵਾਂਗੇ ਕਿ ਤੁਹਾਡੀ ਜਾਂਚ ਯਾਤਰਾ ਕੁਸ਼ਲ ਅਤੇ ਗਲਤੀ-ਰਹਿਤ ਹੈ। 🚀
ਹੁਕਮ | ਵਰਤੋਂ ਦੀ ਉਦਾਹਰਨ |
---|---|
@DynamicPropertySource | ਇਹ ਐਨੋਟੇਸ਼ਨ ਟੈਸਟ ਲਈ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਦੀ ਗਤੀਸ਼ੀਲ ਸੰਰਚਨਾ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ। ਇਹ ਉਦਾਹਰਨ ਵਿੱਚ ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਾਂ ਲਈ ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਸੈੱਟ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। |
DynamicPropertyRegistry | ਇੱਕ ਵਸਤੂ @DynamicPropertySource ਨਾਲ ਐਨੋਟੇਟ ਕੀਤੇ ਤਰੀਕਿਆਂ ਨੂੰ ਪਾਸ ਕੀਤੀ ਗਈ, ਗਤੀਸ਼ੀਲ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ, ਜਿਵੇਂ ਕਿ ਸਰਵਰ ਪੋਰਟਾਂ ਦੀ ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਨੂੰ ਸਮਰੱਥ ਬਣਾਉਂਦੀ ਹੈ। |
setApplicationContext() | ApplicationContextAware ਇੰਟਰਫੇਸ ਤੋਂ, ਇਹ ਵਿਧੀ ਵਾਤਾਵਰਣ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਸਪਰਿੰਗ ਐਪਲੀਕੇਸ਼ਨ ਕਨਟੈਕਸਟ ਤੱਕ ਪਹੁੰਚ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। |
Environment.getProperty() | ਬਸੰਤ ਵਾਤਾਵਰਣ ਤੋਂ ਸੰਪੱਤੀ ਮੁੱਲ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਉਦਾਹਰਨ ਵਿੱਚ, ਇਹ local.server.port ਮੁੱਲ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ। |
@Value | ਫੀਲਡਾਂ ਜਾਂ ਵਿਧੀ ਪੈਰਾਮੀਟਰਾਂ ਵਿੱਚ ਸਪਰਿੰਗ ਵਾਤਾਵਰਨ ਤੋਂ ਸਿੱਧੇ ਮੁੱਲਾਂ ਨੂੰ ਇੰਜੈਕਟ ਕਰਦਾ ਹੈ। ਉਦਾਹਰਨ ਵਿੱਚ, ਇਹ ਕਸਟਮ ਬੀਨ ਕੌਂਫਿਗਰੇਸ਼ਨ ਵਿੱਚ ਪੋਰਟ ਮੁੱਲ ਸੈਟ ਕਰਦਾ ਹੈ। |
@Configuration | BaseControllerWrapper ਵਰਗੇ ਕਸਟਮ ਬੀਨਜ਼ ਦੀ ਰਜਿਸਟ੍ਰੇਸ਼ਨ ਨੂੰ ਸਮਰੱਥ ਕਰਦੇ ਹੋਏ, ਬਸੰਤ IoC ਲਈ ਇੱਕ ਸੰਰਚਨਾ ਕਲਾਸ ਵਜੋਂ ਇੱਕ ਕਲਾਸ ਦੀ ਨਿਸ਼ਾਨਦੇਹੀ ਕਰਦਾ ਹੈ। |
@Bean | ਇੱਕ ਢੰਗ ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਦਾ ਹੈ ਜੋ ਸਪਰਿੰਗ ਦੁਆਰਾ ਪ੍ਰਬੰਧਿਤ ਬੀਨ ਵਾਪਸ ਕਰਦਾ ਹੈ। ਉਦਾਹਰਨ ਵਿੱਚ, ਇਹ ਸਰਵਰ ਪੋਰਟ ਦੇ ਨਾਲ BaseControllerWrapper ਨੂੰ ਸ਼ੁਰੂ ਕਰਦਾ ਹੈ। |
@Autowired | ਸਪਰਿੰਗ-ਪ੍ਰਬੰਧਿਤ ਬੀਨਜ਼ ਨੂੰ ਫੀਲਡਾਂ ਜਾਂ ਵਿਧੀਆਂ ਵਿੱਚ ਇੰਜੈਕਟ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਪਰਮਿਸ਼ਨ ਟੈਸਟ ਕਲਾਸ ਵਿੱਚ ਵਿਸ਼ੇਸ਼ ਕੰਟਰੋਲਰ ਰੈਪਰ। |
@SpringBootTest | ਸਪਰਿੰਗ ਬੂਟ ਵਿੱਚ ਏਕੀਕਰਣ ਟੈਸਟਿੰਗ ਲਈ ਐਨੋਟੇਸ਼ਨ। ਇਹ ਟੈਸਟ ਵਾਤਾਵਰਨ ਸੈਟ ਕਰਦਾ ਹੈ ਅਤੇ ਵੈਬ ਇਨਵਾਇਰਨਮੈਂਟ ਵਰਗੀਆਂ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸਮਰੱਥ ਬਣਾਉਂਦਾ ਹੈ। |
@DirtiesContext | ਟੈਸਟਾਂ ਦੇ ਵਿਚਕਾਰ ਬਸੰਤ ਸੰਦਰਭ ਨੂੰ ਰੀਸੈਟ ਕਰਨ ਲਈ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ। ਇਹ ਪ੍ਰਦਾਨ ਕੀਤੀ ਗਈ ਉਦਾਹਰਨ ਵਿੱਚ ਹਰੇਕ ਟੈਸਟ ਲਈ ਇੱਕ ਸਾਫ਼ ਸਥਿਤੀ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ। |
ਸਥਾਨਕ ਸਰਵਰ ਪੋਰਟਾਂ ਨਾਲ ਟੈਸਟਿੰਗ ਲਈ ਨਿਰਭਰਤਾ ਇੰਜੈਕਸ਼ਨ ਨੂੰ ਸਮਝਣਾ
ਸਪਰਿੰਗ ਬੂਟ ਦਾ ਸ਼ਕਤੀਸ਼ਾਲੀ ਟੈਸਟਿੰਗ ਈਕੋਸਿਸਟਮ ਅਸਲ-ਸੰਸਾਰ ਦੇ ਦ੍ਰਿਸ਼ਾਂ ਦੀ ਨਕਲ ਕਰਨਾ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ, ਪਰ ਕੁਝ ਸੰਰਚਨਾਵਾਂ ਚੁਣੌਤੀਆਂ ਦਾ ਕਾਰਨ ਬਣ ਸਕਦੀਆਂ ਹਨ। ਅਜਿਹਾ ਹੀ ਇੱਕ ਮੁੱਦਾ ਆਟੋਵਾਇਰਿੰਗ ਹੈ @LocalServerPort ਇੱਕ ਟੈਸਟ ਕਲਾਸ ਦੇ ਬਾਹਰ. ਪ੍ਰਦਾਨ ਕੀਤੀਆਂ ਉਦਾਹਰਣਾਂ ਵਿੱਚ, ਸਕ੍ਰਿਪਟਾਂ ਨੂੰ ਇਸ ਸੀਮਾ ਨੂੰ ਦੂਰ ਕਰਨ ਦੇ ਵੱਖ-ਵੱਖ ਤਰੀਕੇ ਦਿਖਾਉਣ ਲਈ ਤਿਆਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਵਰਗੇ ਐਨੋਟੇਸ਼ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ @DynamicPropertySource, ਅਸੀਂ ਗਤੀਸ਼ੀਲ ਤੌਰ 'ਤੇ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਸੈੱਟ ਕਰ ਸਕਦੇ ਹਾਂ ਜਿਵੇਂ ਕਿ ਸਰਵਰ ਪੋਰਟ, ਇਸ ਨੂੰ ਹੋਰ ਬੀਨਜ਼ ਲਈ ਪਹੁੰਚਯੋਗ ਬਣਾ ਕੇ। ਇਹ ਪਹੁੰਚ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਟੈਸਟਾਂ ਦੌਰਾਨ ਪੋਰਟ ਮੁੱਲ ਨੂੰ ਸਹੀ ਢੰਗ ਨਾਲ ਇੰਜੈਕਟ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਭਿਆਨਕ ਪਲੇਸਹੋਲਡਰ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਗਲਤੀ ਤੋਂ ਬਚਦਾ ਹੈ।
ਇੱਕ ਹੋਰ ਸਕ੍ਰਿਪਟ ਦਾ ਲਾਭ ਉਠਾਉਂਦੀ ਹੈ ਐਪਲੀਕੇਸ਼ਨ ਕੰਟੈਕਸਟ ਅਵੇਅਰ ਇੰਟਰਫੇਸ, ਜੋ ਸਪਰਿੰਗ ਐਪਲੀਕੇਸ਼ਨ ਕੰਟੈਕਸਟ ਤੱਕ ਸਿੱਧੀ ਪਹੁੰਚ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ। ਇਹ ਵਿਸ਼ੇਸ਼ ਤੌਰ 'ਤੇ ਲਾਭਦਾਇਕ ਹੁੰਦਾ ਹੈ ਜਦੋਂ ਤੁਸੀਂ ਵਾਤਾਵਰਣ ਵੇਰੀਏਬਲ, ਜਿਵੇਂ ਕਿ ਸਰਵਰ ਪੋਰਟ, ਗਤੀਸ਼ੀਲ ਤੌਰ 'ਤੇ ਮੁੜ ਪ੍ਰਾਪਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। ਉਦਾਹਰਨ ਲਈ, ਜਦੋਂ ਰੈਪਿੰਗ ਕੰਟਰੋਲਰ APIs ਦੀ ਜਾਂਚ ਲਈ ਕਾਲ ਕਰਦਾ ਹੈ, ਤਾਂ ਰੈਪਰ ਕਲਾਸ ਰਨਟਾਈਮ 'ਤੇ ਸਹੀ ਪੋਰਟ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਵਰਤ ਸਕਦੀ ਹੈ। ਇਹ ਵਿਧੀ ਹਾਰਡਕੋਡਿੰਗ ਨੂੰ ਖਤਮ ਕਰਦੀ ਹੈ ਅਤੇ ਟੈਸਟ ਲਚਕਤਾ ਵਿੱਚ ਸੁਧਾਰ ਕਰਦੀ ਹੈ। ਇੱਕ API ਦੀ ਜਾਂਚ ਕਰਨ ਦੀ ਕਲਪਨਾ ਕਰੋ ਜੋ ਇੱਕ ਬੇਤਰਤੀਬ ਪੋਰਟ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ — ਤੁਹਾਨੂੰ ਹੁਣ ਇਸਨੂੰ ਹੱਥੀਂ ਸੈੱਟ ਕਰਨ ਦੀ ਲੋੜ ਨਹੀਂ ਹੈ। 😊
ਤੀਜੀ ਪਹੁੰਚ ਇੱਕ ਸੰਰਚਨਾ ਕਲਾਸ ਵਿੱਚ ਪਰਿਭਾਸ਼ਿਤ ਇੱਕ ਕਸਟਮ ਬੀਨ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ। ਦੀ ਵਰਤੋਂ ਕਰਕੇ @ਮੁੱਲ ਐਨੋਟੇਸ਼ਨ, ਸਥਾਨਕ ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਸ਼ੁਰੂਆਤ ਦੇ ਦੌਰਾਨ ਬੀਨ ਵਿੱਚ ਇੰਜੈਕਟ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਵਿਧੀ ਖਾਸ ਤੌਰ 'ਤੇ ਤੁਹਾਡੇ ਸੈੱਟਅੱਪ ਨੂੰ ਮਾਡਿਊਲਰਾਈਜ਼ ਕਰਨ ਅਤੇ ਕਈ ਟੈਸਟ ਦ੍ਰਿਸ਼ਾਂ ਲਈ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਹਿੱਸੇ ਬਣਾਉਣ ਲਈ ਉਪਯੋਗੀ ਹੈ। ਉਦਾਹਰਨ ਲਈ, ਏ ਬੇਸਕੰਟਰੋਲਰ ਰੈਪਰ ਪੋਰਟ-ਵਿਸ਼ੇਸ਼ ਤਰਕ ਨੂੰ ਹੈਂਡਲ ਕਰਨ ਲਈ ਕੌਂਫਿਗਰ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਅਤੇ ਇਸਦੇ ਉਪ-ਕਲਾਸ ਖਾਸ ਅੰਤ ਬਿੰਦੂਆਂ 'ਤੇ ਫੋਕਸ ਕਰ ਸਕਦੇ ਹਨ। ਇਹ ਕੋਡ ਨੂੰ ਸਾਫ਼ ਅਤੇ ਸਾਰੇ ਟੈਸਟਾਂ ਵਿੱਚ ਬਣਾਈ ਰੱਖਣਾ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ।
ਇਹਨਾਂ ਵਿੱਚੋਂ ਹਰੇਕ ਵਿਧੀ ਨੂੰ ਮਾਪਯੋਗਤਾ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਨੂੰ ਧਿਆਨ ਵਿੱਚ ਰੱਖ ਕੇ ਤਿਆਰ ਕੀਤਾ ਗਿਆ ਹੈ। ਭਾਵੇਂ ਤੁਸੀਂ ਇੱਕ ਛੋਟੇ ਪੈਮਾਨੇ ਦੇ ਟੈਸਟ ਸੂਟ ਜਾਂ ਇੱਕ ਵਿਆਪਕ ਏਕੀਕਰਣ ਟੈਸਟਿੰਗ ਫਰੇਮਵਰਕ 'ਤੇ ਕੰਮ ਕਰ ਰਹੇ ਹੋ, ਸਹੀ ਪਹੁੰਚ ਚੁਣਨਾ ਤੁਹਾਡੀਆਂ ਖਾਸ ਜ਼ਰੂਰਤਾਂ 'ਤੇ ਨਿਰਭਰ ਕਰਦਾ ਹੈ। ਇਹਨਾਂ ਰਣਨੀਤੀਆਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ, ਤੁਸੀਂ ਮਜ਼ਬੂਤ ਅਤੇ ਗਲਤੀ-ਮੁਕਤ ਟੈਸਟਿੰਗ ਸੈੱਟਅੱਪ ਨੂੰ ਯਕੀਨੀ ਬਣਾ ਸਕਦੇ ਹੋ। ਸਪਰਿੰਗ ਬੂਟ ਸਰਵੋਤਮ ਅਭਿਆਸਾਂ ਦੀ ਪਾਲਣਾ ਕਰਨ ਦੇ ਵਾਧੂ ਲਾਭ ਦਾ ਮਤਲਬ ਹੈ ਟੈਸਟ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਦੌਰਾਨ ਘੱਟ ਹੈਰਾਨੀ ਅਤੇ ਉਤਪਾਦਨ ਦੇ ਵਿਵਹਾਰ ਨਾਲ ਬਿਹਤਰ ਅਨੁਕੂਲਤਾ। 🚀
ਹੱਲ 1: ਪੋਰਟ ਇੰਜੈਕਸ਼ਨ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ @DynamicPropertySource ਦੀ ਵਰਤੋਂ ਕਰਨਾ
ਇਹ ਪਹੁੰਚ ਸਪਰਿੰਗ ਬੂਟ ਦੇ @DynamicPropertySource ਦੀ ਵਰਤੋਂ ਟੈਸਟਿੰਗ ਦੌਰਾਨ ਸਥਾਨਕ ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਸੈੱਟ ਕਰਨ ਲਈ ਕਰਦੀ ਹੈ।
@Component
public class BaseControllerWrapper {
protected int port;
}
@Component
public class SpecificControllerWrapper extends BaseControllerWrapper {
public void callEndpoint() {
System.out.println("Calling endpoint on port: " + port);
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
@Autowired
private SpecificControllerWrapper specificControllerWrapper;
@DynamicPropertySource
static void dynamicProperties(DynamicPropertyRegistry registry) {
registry.add("server.port", () -> 8080);
}
@Test
public void testSomething() {
specificControllerWrapper.port = 8080; // Dynamically set
specificControllerWrapper.callEndpoint();
}
}
ਹੱਲ 2: ਪੋਰਟ ਇੰਜੈਕਸ਼ਨ ਲਈ ApplicationContextAware ਦੀ ਵਰਤੋਂ ਕਰਨਾ
ਇਹ ਹੱਲ ਗਤੀਸ਼ੀਲ ਤੌਰ 'ਤੇ ਵਾਤਾਵਰਣ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ApplicationContext ਦਾ ਲਾਭ ਲੈਂਦਾ ਹੈ।
@Component
public class BaseControllerWrapper {
protected int port;
}
@Component
public class SpecificControllerWrapper extends BaseControllerWrapper {
public void callEndpoint() {
System.out.println("Calling endpoint on port: " + port);
}
}
@Component
public class PortInjector implements ApplicationContextAware {
@Autowired
private SpecificControllerWrapper wrapper;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Environment env = applicationContext.getEnvironment();
wrapper.port = Integer.parseInt(env.getProperty("local.server.port", "8080"));
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
@Autowired
private SpecificControllerWrapper specificControllerWrapper;
@Test
public void testSomething() {
specificControllerWrapper.callEndpoint();
}
}
ਹੱਲ 3: ਪੋਰਟ ਪ੍ਰਬੰਧਨ ਲਈ ਇੱਕ ਕਸਟਮ ਬੀਨ ਨੂੰ ਕੌਂਫਿਗਰ ਕਰਨਾ
ਇਹ ਵਿਧੀ ਪੋਰਟ ਇੰਜੈਕਸ਼ਨ ਅਤੇ ਰੈਜ਼ੋਲੂਸ਼ਨ ਨੂੰ ਸੰਭਾਲਣ ਲਈ ਇੱਕ ਕਸਟਮ ਬੀਨ ਸੈਟ ਅਪ ਕਰਦੀ ਹੈ।
@Configuration
public class PortConfig {
@Bean
public BaseControllerWrapper baseControllerWrapper(@Value("${local.server.port}") int port) {
BaseControllerWrapper wrapper = new BaseControllerWrapper();
wrapper.port = port;
return wrapper;
}
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PermissionsTest {
@Autowired
private SpecificControllerWrapper specificControllerWrapper;
@Test
public void testSomething() {
specificControllerWrapper.callEndpoint();
}
}
ਬਸੰਤ ਬੂਟ ਟੈਸਟਾਂ ਵਿੱਚ ਨਿਰਭਰਤਾ ਇੰਜੈਕਸ਼ਨ ਚੁਣੌਤੀਆਂ ਨੂੰ ਪਾਰ ਕਰਨਾ
ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਾਂ ਵਿੱਚ ਨਿਰਭਰਤਾ ਟੀਕਾ ਲਗਾਉਣਾ ਮੁਸ਼ਕਲ ਹੋ ਸਕਦਾ ਹੈ ਜਦੋਂ ਇਹ ਵਰਤਣ ਦੀ ਗੱਲ ਆਉਂਦੀ ਹੈ @LocalServerPort. ਇਹ ਐਨੋਟੇਸ਼ਨ ਟੈਸਟਾਂ ਦੌਰਾਨ ਬੇਤਰਤੀਬ ਸਰਵਰ ਪੋਰਟਾਂ ਨੂੰ ਇੰਜੈਕਟ ਕਰਨ ਲਈ ਸ਼ਕਤੀਸ਼ਾਲੀ ਹੈ ਪਰ ਇਸਦੀ ਇੱਕ ਮੁੱਖ ਸੀਮਾ ਹੈ: ਇਹ ਸਿਰਫ ਟੈਸਟ ਕਲਾਸਾਂ ਦੇ ਅੰਦਰ ਕੰਮ ਕਰਦੀ ਹੈ। ਜਦੋਂ ਬਾਹਰ ਵਰਤਿਆ ਜਾਂਦਾ ਹੈ, ਜਿਵੇਂ ਕਿ ਸਾਂਝੇ ਹਿੱਸੇ ਜਾਂ ਰੈਪਰਾਂ ਵਿੱਚ, ਸਪਰਿੰਗ ਪਲੇਸਹੋਲਡਰ ਨੂੰ ਹੱਲ ਕਰਨ ਵਿੱਚ ਅਸਫਲ ਰਹਿੰਦੀ ਹੈ, ਜਿਸ ਨਾਲ ਗਲਤੀਆਂ ਹੁੰਦੀਆਂ ਹਨ। ਇਸ ਨੂੰ ਸੰਭਾਲਣ ਲਈ, ਅਸੀਂ ਡਾਇਨਾਮਿਕ ਪ੍ਰਾਪਰਟੀ ਕੌਂਫਿਗਰੇਸ਼ਨ ਜਾਂ ਵਾਤਾਵਰਣ-ਜਾਗਰੂਕ ਹੱਲਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹਾਂ।
ਇੱਕ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਪਹੁੰਚ ਦਾ ਲਾਭ ਉਠਾਉਣਾ ਹੈ @DynamicPropertySource ਐਨੋਟੇਸ਼ਨ, ਜੋ ਕਿ ਸਥਾਨਕ ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਸੰਪੱਤੀ ਦੇ ਰੂਪ ਵਿੱਚ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਰਜਿਸਟਰ ਕਰਦਾ ਹੈ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਮੁੱਲ ਬਸੰਤ ਸੰਦਰਭ ਵਿੱਚ ਉਪਲਬਧ ਹੈ, ਇੱਥੋਂ ਤੱਕ ਕਿ ਟੈਸਟ ਕਲਾਸਾਂ ਦੇ ਬਾਹਰ ਵੀ। ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਮੁੜ ਵਰਤੋਂਯੋਗਤਾ ਲਈ ਇੱਕ ਕੰਟਰੋਲਰ ਰੈਪਰ ਵਿੱਚ REST API ਕਾਲਾਂ ਨੂੰ ਲਪੇਟਦੇ ਹੋ, ਤਾਂ ਪੋਰਟ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਸੈੱਟ ਕਰਨਾ ਤੁਹਾਡੇ ਟੈਸਟਾਂ ਨੂੰ ਮਾਡਿਊਲਰ ਅਤੇ ਸਾਫ਼ ਰੱਖਦਾ ਹੈ। 🚀
ਇੱਕ ਹੋਰ ਤਰੀਕਾ ਹੈ ਵਰਤ ਰਿਹਾ ਹੈ ApplicationContext ਅਤੇ ਇਸ ਦੇ Environment ਸਰਵਰ ਪੋਰਟ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਲਿਆਉਣ ਲਈ। ਇਹ ਪਹੁੰਚ ਖਾਸ ਤੌਰ 'ਤੇ ਗੁੰਝਲਦਾਰ ਐਪਲੀਕੇਸ਼ਨਾਂ ਵਿੱਚ ਉਪਯੋਗੀ ਹੈ ਜਿੱਥੇ ਪ੍ਰਾਪਰਟੀ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਰਨਟਾਈਮ 'ਤੇ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਪੋਰਟ ਨੂੰ ਸਿੱਧੇ ਰੈਪਰ ਜਾਂ ਬੀਨ ਵਿੱਚ ਕੌਂਫਿਗਰ ਕਰਕੇ, ਤੁਸੀਂ ਟੈਸਟ ਸੈੱਟਅੱਪ ਨੂੰ ਤੋੜੇ ਬਿਨਾਂ ਅਨੁਕੂਲਤਾ ਨੂੰ ਯਕੀਨੀ ਬਣਾਉਂਦੇ ਹੋ।
ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਾਂ ਵਿੱਚ @LocalServerPort ਬਾਰੇ ਅਕਸਰ ਪੁੱਛੇ ਜਾਂਦੇ ਸਵਾਲ
- ਕਿਵੇਂ ਕਰਦਾ ਹੈ @LocalServerPort ਕੰਮ?
- ਇਹ ਇੱਕ ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟ ਦੌਰਾਨ ਏਮਬੈਡਡ ਸਰਵਰ ਨੂੰ ਨਿਰਧਾਰਤ ਬੇਤਰਤੀਬੇ ਪੋਰਟ ਨੂੰ ਇੰਜੈਕਟ ਕਰਦਾ ਹੈ।
- ਕੀ ਮੈਂ ਵਰਤ ਸਕਦਾ ਹਾਂ @LocalServerPort ਇੱਕ ਟੈਸਟ ਕਲਾਸ ਦੇ ਬਾਹਰ?
- ਸਿੱਧੇ ਤੌਰ 'ਤੇ ਨਹੀਂ, ਪਰ ਤੁਸੀਂ ਹੱਲ ਵਰਤ ਸਕਦੇ ਹੋ ਜਿਵੇਂ ਕਿ @DynamicPropertySource ਜਾਂ ApplicationContext.
- ਕੀ ਹੈ @DynamicPropertySource?
- ਇਹ ਇੱਕ ਸਪਰਿੰਗ ਬੂਟ ਵਿਸ਼ੇਸ਼ਤਾ ਹੈ ਜੋ ਤੁਹਾਨੂੰ ਟੈਸਟਾਂ ਦੌਰਾਨ ਸੰਪਤੀਆਂ ਨੂੰ ਗਤੀਸ਼ੀਲ ਰੂਪ ਵਿੱਚ ਰਜਿਸਟਰ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦੀ ਹੈ।
- ਸਪਰਿੰਗ ਪਲੇਸਹੋਲਡਰ ਰੈਜ਼ੋਲੂਸ਼ਨ ਗਲਤੀ ਕਿਉਂ ਸੁੱਟਦਾ ਹੈ?
- ਇਹ ਵਾਪਰਦਾ ਹੈ ਕਿਉਂਕਿ ਪਲੇਸਹੋਲਡਰ ${local.server.port} ਟੈਸਟ ਸੰਦਰਭ ਤੋਂ ਬਾਹਰ ਹੱਲ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ ਹੈ।
- ਕੀ ਮੈਂ ਸਾਂਝੇ ਰੈਪਰ ਨਾਲ ਮਲਟੀਪਲ ਕੰਟਰੋਲਰਾਂ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹਾਂ?
- ਹਾਂ, ਡਾਇਨਾਮਿਕ ਪੋਰਟ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਿਧੀਆਂ ਤੁਹਾਨੂੰ ਮਲਟੀਪਲ ਕੰਟਰੋਲਰਾਂ ਲਈ ਇੱਕ ਸਿੰਗਲ ਰੈਪਰ ਨੂੰ ਕੁਸ਼ਲਤਾ ਨਾਲ ਦੁਬਾਰਾ ਵਰਤਣ ਦਿੰਦੀਆਂ ਹਨ। 😊
ਪੋਰਟ ਇੰਜੈਕਸ਼ਨ ਦੀਆਂ ਚੁਣੌਤੀਆਂ ਨੂੰ ਸਮੇਟਣਾ
ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋਏ @LocalServerPort ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਾਂ ਵਿੱਚ ਪ੍ਰਭਾਵਸ਼ਾਲੀ ਢੰਗ ਨਾਲ ਟੈਸਟ ਸੰਦਰਭ ਵਿਵਹਾਰ ਦੀ ਮਜ਼ਬੂਤ ਸਮਝ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ। ਹੱਲ ਜਿਵੇਂ ਕਿ ਗਤੀਸ਼ੀਲ ਸੰਪੱਤੀ ਸੰਰਚਨਾ ਜਾਂ ਵਾਤਾਵਰਣ-ਅਧਾਰਤ ਟੀਕੇ ਇਹਨਾਂ ਮੁੱਦਿਆਂ ਨੂੰ ਸੰਭਾਲਣ ਨੂੰ ਸਰਲ ਬਣਾਉਂਦੇ ਹਨ। ਇਹ ਯਕੀਨੀ ਬਣਾਉਂਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਟੈਸਟ ਸਥਿਰਤਾ ਨਾਲ ਸਮਝੌਤਾ ਕੀਤੇ ਬਿਨਾਂ ਕੰਟਰੋਲਰ ਰੈਪਰ ਵਰਗੇ ਭਾਗਾਂ ਦੀ ਮੁੜ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।
ਸਭ ਤੋਂ ਵਧੀਆ ਅਭਿਆਸਾਂ ਨੂੰ ਅਪਣਾਉਣਾ, ਜਿਵੇਂ ਕਿ ਗਤੀਸ਼ੀਲ ਪੋਰਟ ਰਜਿਸਟ੍ਰੇਸ਼ਨ, ਨਾ ਸਿਰਫ਼ ਗਲਤੀਆਂ ਨੂੰ ਹੱਲ ਕਰਦਾ ਹੈ ਬਲਕਿ ਟੈਸਟ ਮਾਡਿਊਲਰਿਟੀ ਨੂੰ ਵੀ ਵਧਾਉਂਦਾ ਹੈ। ਇਹਨਾਂ ਤਰੀਕਿਆਂ ਨਾਲ, ਡਿਵੈਲਪਰ ਗੁੰਝਲਦਾਰ REST API ਟੈਸਟਿੰਗ ਲਈ ਮਜ਼ਬੂਤ ਅਤੇ ਮੁੜ ਵਰਤੋਂ ਯੋਗ ਟੈਸਟ ਸੈੱਟਅੱਪ ਬਣਾ ਸਕਦੇ ਹਨ। ਇੱਕ ਸਾਫ਼, ਗਲਤੀ-ਮੁਕਤ ਸੈੱਟਅੱਪ ਭਰੋਸੇਯੋਗ ਅਤੇ ਕੁਸ਼ਲ ਟੈਸਟ ਐਗਜ਼ੀਕਿਊਸ਼ਨ ਲਈ ਰਾਹ ਪੱਧਰਾ ਕਰਦਾ ਹੈ। 😊
ਸਰੋਤ ਅਤੇ ਹਵਾਲੇ
- ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਿੰਗ ਅਤੇ ਐਨੋਟੇਸ਼ਨਾਂ ਬਾਰੇ ਵੇਰਵੇ ਅਧਿਕਾਰਤ ਬਸੰਤ ਦਸਤਾਵੇਜ਼ਾਂ ਤੋਂ ਲਏ ਗਏ ਸਨ। ਹੋਰ ਲਈ, 'ਤੇ ਜਾਓ ਬਸੰਤ ਬੂਟ ਅਧਿਕਾਰਤ ਦਸਤਾਵੇਜ਼ .
- ਸਟੈਕ ਓਵਰਫਲੋ 'ਤੇ ਕਮਿਊਨਿਟੀ ਵਿਚਾਰ-ਵਟਾਂਦਰੇ ਤੋਂ ਨਿਰਭਰਤਾ ਟੀਕੇ ਦੇ ਮੁੱਦਿਆਂ ਨੂੰ ਹੱਲ ਕਰਨ ਦੀ ਸਮਝ ਪ੍ਰਾਪਤ ਕੀਤੀ ਗਈ ਸੀ। 'ਤੇ ਅਸਲੀ ਥਰਿੱਡ ਦੀ ਜਾਂਚ ਕਰੋ ਸਟੈਕ ਓਵਰਫਲੋ .
- ਟੈਸਟਿੰਗ ਸੰਦਰਭਾਂ ਵਿੱਚ @DynamicPropertySource ਦੀ ਵਰਤੋਂ ਕਰਨ ਦੀਆਂ ਵਧੀਕ ਉਦਾਹਰਨਾਂ ਨੂੰ Baeldung ਦੇ ਵਿਸਤ੍ਰਿਤ ਗਾਈਡਾਂ ਤੋਂ ਹਵਾਲਾ ਦਿੱਤਾ ਗਿਆ ਸੀ: ਸਪਰਿੰਗ ਬੂਟ ਟੈਸਟਾਂ ਵਿੱਚ ਡਾਇਨਾਮਿਕ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ .
- ਜਾਵਾ ਕੋਡ ਗੀਕਸ 'ਤੇ ਲੇਖਾਂ ਰਾਹੀਂ ਐਪਲੀਕੇਸ਼ਨ ਕੰਟੈਕਸਟ ਦੀਆਂ ਆਮ ਧਾਰਨਾਵਾਂ ਅਤੇ ਡਾਇਨਾਮਿਕ ਪ੍ਰਾਪਰਟੀ ਰੈਜ਼ੋਲਿਊਸ਼ਨ ਵਿੱਚ ਇਸਦੀ ਵਰਤੋਂ ਦੀ ਖੋਜ ਕੀਤੀ ਗਈ ਸੀ: ਜਾਵਾ ਕੋਡ ਗੀਕਸ .