Generics Support
In SwiftyMocky, we are supporting generics for methods generation, as well as for generic constrained methods in mocked protocols.
Protocols with generic methods
We support generic constrained methods in protocols definition, so something like below:
//sourcery: AutoMockable
public protocol HistorySectionMapperType: class {
func map<T: DateSortable>(_ items: [T]) -> [(key: String, items: [T])]
}
Will generate valid mock.
Please have in mind, that generic methods are problematic in a lot of cases, so you could experience:
- AutoComplete issues for given, perform and verify: - use full
<MockName>.Given.
for getting autocomplete. - Use full
.any(Value.Type)
instead of.any
, to avoid ambiguity. - Matching issues - if you are using generic parameters as
.value
, you might need to add additional comparators toMatcher
instance. However, it should be handled for most of basic types.
Protocols with associated types
We are also supporting protocols with associated types (mock will be generated as generic class), but that requires some aditional manuall annotations:
//sourcery: AutoMockable
//sourcery: associatedtype = "T1: Sequence"
//sourcery: associatedtype = "T2: Comparable, EmptyProtocol"
protocol AVeryAssociatedProtocol {
associatedtype T1: Sequence
associatedtype T2: Comparable, EmptyProtocol
func fetch(for value: T2) -> T1
}
Definition above will produce:
class AVeryAssociatedProtocolMock<TypeT1,TypeT2>: AVeryAssociatedProtocol, Mock where TypeT1: Sequence, TypeT2: Comparable, TypeT2: EmptyProtocol {
typealias T1 = TypeT1
typealias T2 = TypeT2
// ...