java 单元测试技巧_其他一些单元测试技巧
java 單元測(cè)試技巧
在我以前的文章中,我展示了有關(guān)JavaBeans單元測(cè)試的一些技巧。 在此博客文章中,我將針對(duì)單元測(cè)試一些相當(dāng)常見(jiàn)的Java代碼(即實(shí)用程序類(lèi)和Log4J日志記錄語(yǔ)句)提供另外兩個(gè)提示。
測(cè)試實(shí)用程序類(lèi)
如果您的實(shí)用程序類(lèi)遵循與我傾向于編寫(xiě)的相同的基本設(shè)計(jì),則它們由帶有私有構(gòu)造函數(shù)和所有靜態(tài)方法的最終類(lèi)組成。
實(shí)用類(lèi)測(cè)試儀
該UtilityClassTester本身也遵循上述的實(shí)用程序類(lèi)約束,因此有什么更好的方法通過(guò)使用它來(lái)測(cè)試自身來(lái)證明其用途:
UtilityClassTester的測(cè)試用例
package it.jdev.example;import org.junit.Test;public class UtilityClassTesterTest {@Testpublic void test() throws Exception {UtilityClassTester.test(UtilityClassTester.class);}}測(cè)試Log4J記錄事件
當(dāng)調(diào)用聲明異常的方法時(shí),您將重新聲明該相同的異常,或者嘗試在try-catch塊中對(duì)其進(jìn)行處理。 在后一種情況下,您至少要做的是記錄捕獲的異常。 下面是一個(gè)非常簡(jiǎn)單的示例:
MyService示例
package it.jdev.example;import java.lang.invoke.MethodHandles;import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;@Service public class MyService {private static final Logger LOGGER = Logger.getLogger(MethodHandles.Lookup.class);@Autowiredprivate MyRepository myRepository;public void doSomethingUseful() {try {myRepository.doSomethingVeryUseful();} catch (SomeException e) {LOGGER.error("Some very informative error logging.", e);}}}當(dāng)然,您將需要測(cè)試是否正確記錄了異常。 遵循以下內(nèi)容:
MyService日志記錄事件的測(cè)試用例
package it.jdev.example;import static org.junit.Assert.*;import org.apache.log4j.spi.LoggingEvent; import org.junit.*; import org.mockito.*;public class MyServiceTest {@Mockprivate MyRepository myRepository;@InjectMocksprivate MyService myService = new MyService();@Beforepublic void setup() {MockitoAnnotations.initMocks(this);}@Testpublic void thatSomeExceptionIsLogged() throws Exception {TestAppender testAppender = new TestAppender();Mockito.doThrow(SomeException.class).when(myRepository).doSomethingVeryUseful();myService.doSomethingUseful();assertTrue(testAppender.getEvents().size() == 1);final LoggingEvent loggingEvent = testAppender.getEvents().get(0);assertEquals("Some very informative error logging.", loggingEvent.getMessage().toString());}}但是,如何實(shí)現(xiàn)這一目標(biāo)呢? 事實(shí)證明,將新的LogAppender添加到Log4J RootLogger非常容易。
用于Log4J的TestAppender
package it.jdev.example;import java.util.*;import org.apache.log4j.*; import org.apache.log4j.spi.*;/*** Utility for testing Log4j logging events.* <p>* Usage:<br />* <code>* TestAppender testAppender = new TestAppender();<br />* classUnderTest.methodThatWillLog();<br /><br />* LoggingEvent loggingEvent = testAppender.getEvents().get(0);<br /><br />* assertEquals()...<br /><br />* </code>*/ public class TestAppender extends AppenderSkeleton {private final List<LoggingEvent> events = new ArrayList<LoggingEvent>();public TestAppender() {this(Level.ERROR);}public TestAppender(final Level level) {super();Logger.getRootLogger().addAppender(this);this.addFilter(new LogLevelFilter(level));}@Overrideprotected void append(final LoggingEvent event) {events.add(event);}@Overridepublic void close() {}@Overridepublic boolean requiresLayout() {return false;}public List<LoggingEvent> getEvents() {return events;}/*** Filter that decides whether to accept or deny a logging event based on* the logging level.*/protected class LogLevelFilter extends Filter {private final Level level;public LogLevelFilter(final Level level) {super();this.level = level;}@Overridepublic int decide(final LoggingEvent event) {if (event.getLevel().isGreaterOrEqual(level)) {return ACCEPT;} else {return DENY;}}}}翻譯自: https://www.javacodegeeks.com/2014/09/some-more-unit-test-tips.html
java 單元測(cè)試技巧
總結(jié)
以上是生活随笔為你收集整理的java 单元测试技巧_其他一些单元测试技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 猎豹浏览器平板电脑版(猎豹浏览器pc版)
- 下一篇: win10如何把我的电脑图标加上到桌面如