日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

其他一些单元测试技巧

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 其他一些单元测试技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在我以前的文章中,我展示了有關(guān)JavaBeans單元測(cè)試的一些技巧。 在此博客文章中,我將提供有關(guān)單元測(cè)試某些相當(dāng)常見的Java代碼的另外兩個(gè)技巧,即實(shí)用程序類Log4J日志記錄語句 。

測(cè)試實(shí)用程序類

如果您的實(shí)用程序類遵循與我傾向于編寫的相同的基本設(shè)計(jì),則它們由帶有私有構(gòu)造函數(shù)和所有靜態(tài)方法的最終類組成。



實(shí)用類測(cè)試儀

package it.jdev.example;import static org.junit.Assert.*;import java.lang.reflect.*;import org.junit.Test;/*** Tests that a utility class is final, contains one private constructor, and* all methods are static.*/ public final class UtilityClassTester {private UtilityClassTester() {super();}/*** Verifies that a utility class is well defined.* * @param clazz* @throws Exception*/@Testpublic static void test(final Class<?> clazz) throws Exception {// Utility classes must be final.assertTrue("Class must be final.", Modifier.isFinal(clazz.getModifiers()));// Only one constructor is allowed and it has to be private.assertTrue("Only one constructor is allowed.", clazz.getDeclaredConstructors().length == 1);final Constructor<?> constructor = clazz.getDeclaredConstructor();assertFalse("Constructor must be private.", constructor.isAccessible());assertTrue("Constructor must be private.", Modifier.isPrivate(constructor.getModifiers()));// All methods must be static.for (final Method method : clazz.getMethods()) {if (!Modifier.isStatic(method.getModifiers()) && method.getDeclaringClass().equals(clazz)) {fail("Non-static method found: " + method + ".");}}}}

該UtilityClassTester本身也遵循上面提到的實(shí)用程序類約束,因此有什么更好的方法通過使用它來測(cè)試自身來證明其用途:

UtilityClassTester的測(cè)試用例

package it.jdev.example;import org.junit.Test;public class UtilityClassTesterTest {@Testpublic void test() throws Exception {UtilityClassTester.test(UtilityClassTester.class);}}

測(cè)試Log4J記錄事件

調(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

總結(jié)

以上是生活随笔為你收集整理的其他一些单元测试技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。