All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalamock.package.scala Maven / Gradle / Ivy

The newest version!
// Copyright (c) 2011-2015 ScalaMock Contributors (https://github.com/paulbutcher/ScalaMock/graphs/contributors)
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

package org

/**
 * ==ScalaMock: Native Scala Mocking==
 * 
 * To use ScalaMock, you need the relevant `MockFactoryBase` trait implementation:
 * 
 *  - for ScalaTest, use [[org.scalamock.scalatest.MockFactory]],
 *  - for Specs2 use [[org.scalamock.specs2.IsolatedMockFactory]] or 
 *    [[org.scalamock.specs2.MockContext]] 
 * 
 * At present, ScalaMock can only mock traits, Java interfaces, and non-final 
 * classes that define a default constructor. A future version will be able to 
 * mock any class, and singleton/companion objects. 
 *
 * ScalaMock supports two different mocking styles - ''expectations first'' and
 * ''record then verify''. These styles can be mixed within a single test.
 * 
 * ==Expectations-First Style==
 * 
 * In the expectations-first style, expectations are set on mock objects before
 * exercising the system under test. If these expectations are not met, the 
 * test fails.
 * 
 * A mock function that supports this style is created with `mockFunction`. For 
 * example, to create a mock function taking a single `Int` argument and 
 * returning a `String`:
 * 
 * {{{
 * val m = mockFunction[Int, String]
 * }}}
 * 
 * A mock object that supports this style is created with `mock`. For example,
 * to create a mock that implements the `Turtle` trait:
 * 
 * {{{
 * val m = mock[Turtle]
 * }}}
 * 
 * Expectations can then be set using `expects`:
 * 
 * {{{
 * (m.setPosition _).expects(10.0, 10.0)
 * (m.forward _).expects(5.0)
 * (m.getPosition _).expects().returning(15.0, 10.0)
 * 
 * drawLine(m, (10.0, 10.0), (15.0, 10.0))
 * }}}
 * 
 * ==Record-then-Verify (Mockito) Style==
 * 
 * In the record then verify style, expectations are verified after the system
 * under test has executed. 
 * 
 * A stub function that supports this style is created with `stubFunction`. For 
 * example:
 * 
 * {{{
 * val m = stubFunction[Int, String]
 * }}}
 * 
 * A stub object that supports this style is created with `stub`. For example:
 * 
 * {{{
 * val m = stub[Turtle]
 * }}}
 * 
 * Return values that are used by the system under test can be set up by using 
 * `when`. Calls are verified using `verify`:
 * 
 * {{{
 * (m.getPosition _).when().returns(15.0, 10.0)
 * 
 * drawLine(m, (10.0, 10.0), (15.0, 10.0))
 * 
 * (m.setPosition _).verify(10.0, 10.0)
 * (m.forward _).verify(5.0)
 * }}}
 * 
 * ==Argument matching==
 * 
 * ScalaMock supports two types of generalised matching: ''wildcards'' and
 * ''epsilon matching''.
 * 
 * ===Wildcards===
 *
 * Wildcard values are specified with an `*` (asterisk). For example:
 * 
 * {{{
 * m expects ("this", *)
 * }}}
 * 
 * will match any of the following:
 *
 * {{{
 * m("this", 42)
 * m("this", 1.0)
 * m("this", null)
 * }}}
 *
 * ===Epsilon matching===
 *
 * Epsilon matching is useful when dealing with floating point values. An epsilon match is
 * specified with the `~` (tilde) operator:
 *
 * {{{
 * m expects (~42.0)
 * }}}
 *
 * will match:
 *
 * {{{
 * m(42.0)
 * m(42.0001)
 * m(41.9999)
 * }}}
 *
 * but will not match:
 *
 * {{{
 * m(43.0)
 * m(42.1)
 * }}}
 * 
 * ===Repeated parameters===
 * 
 * Repeated parameters are represented as a `Seq`. For example, given:
 * 
 * {{{
 * def takesRepeatedParameter(x: Int, ys: String*)
 * }}}
 *
 * you can set an expectation with:
 * 
 * {{{
 * (m.takesRepeatedParameter _).expects(42, Seq("red", "green", "blue"))
 * }}}
 * 
 * ===Predicate matching===
 *
 * More complicated argument matching can be implemented by using `where` to 
 * pass a predicate:
 *
 * {{{
 * m = mockFunction[Double, Double, Unit]
 * m expects (where { _ < _ })
 * }}}
 * 
 * ===Return values===
 * 
 * By default mocks and stubs return `null`. You can return a computed return 
 * value (or throw a computed exception) with `onCall`:
 * 
 * {{{
 * val mockIncrement = mockFunction[Int, Int]
 * m expects (*) onCall { _ + 1 }
 * }}}
 * 
 * ===Overloaded, curried and polymorphic methods===
 * 
 * Overloaded, curried and polymorphic methods can be mocked by specifying 
 * either argument types or type parameters. For example:
 * 
 * {{{
 * trait Foo {
 *   def overloaded(x: Int): String
 *   def overloaded(x: String): String
 *   def overloaded[T](x: T): String
 *   def curried(x: Int)(y: Double): String
 *   def polymorphic[T](x: List[T]): String
 * }
 * }}}
 * 
 * {{{
 * val m = mock[Foo]
 * (m.overloaded(_: Int)).expects(10)
 * (m.overloaded(_: String)).expects("foo")
 * (m.overloaded[Double] _).expects(1.23)
 * (m.curried(_: Int)(_: Double)).expects(10, 1.23)
 * (m.polymorphic(_: List[Int])).expects(List(1, 2, 3))
 * (m.polymorphic[String] _).expects("foo")
 * }}}
 *
 * ===Exceptions===
 *
 * Instead of a return value, mocks and stubs can be instructed to throw:
 * 
 * {{{
 * m expects ("this", "that") throws new RuntimeException("what's that?")
 * }}}
 * 
 * ===Call count===
 *
 * By default, mocks and stubs expect exactly one call. Alternative constraints
 * can be set with `repeat`:
 *
 * {{{
 * m1.expects(42).returns(42).repeat(3 to 7)
 * m2 expects (3) repeat 10
 * }}}
 *
 * There are various aliases for common expectations and styles:
 *
 * {{{
 * m1.expects("this", "that").once
 * m2.expects().returns("foo").noMoreThanTwice
 * m3.expects(42).repeated(3).times
 * }}}
 *
 * For a full list, see [[org.scalamock.handlers.CallHandler]].
 *
 * ==Ordering==
 *
 * By default, expectations can be satisfied in any order. For example:
 *
 * {{{
 * m expects (1)
 * m expects (2)
 * m(2)
 * m(1)
 * }}}
 *
 * A specific sequence can be enforced with `inSequence`:
 * 
 * {{{
 * inSequence {
 *   m expects (1)
 *   m expects (2)
 * }
 * m(2) // throws ExpectationException
 * m(1)
 * }}}
 *
 * Multiple sequences can be specified. As long as the calls within each sequence happen in the
 * correct order, calls within different sequences can be interleaved. For example:
 *
 * {{{
 * inSequence {
 *   m expects (1)
 *   m expects (2)
 * }
 * inSequence {
 *   m expects (3)
 *   m expects (4)
 * }
 *
 * m(3)
 * m(1)
 * m(2)
 * m(4)
 * }}}
 *
 * To specify that there is no constraint on ordering, use `inAnyOrder` (there is an implicit
 * `inAnyOrder` at the top level). Calls to `inSequence` and `inAnyOrder` can be arbitrarily
 * nested. For example:
 *
 * {{{
 * (m.a _).expects()
 * inSequence {
 *   (m.b _).expects()
 *   inAnyOrder {
 *     (m.c _).expects()
 *     inSequence {
 *       (m.d _).expects()
 *       (m.e _).expects()
 *     }
 *     (m.f _).expects()
 *   }
 *   (m.g _).expects()
 * }
 * }}}
 * 
 * == Threads ==
 * 
 * ScalaMock will work with tests that are run in parallel (Specs2 runs tests in parallel by
 * default, and ScalaTest does so with `ParallelTestExecution`).
 * 
 * You can call mocks from other threads within tests, but any such calls must be complete
 * before the test completes - it's an error to call a mock afterwards.
 */
package object scalamock




© 2015 - 2024 Weber Informatics LLC | Privacy Policy